NIM编译时无法求值错误求助:动态尺寸实例化Matrix问题
解决Nim中“can't evaluate at compile time”编译错误
错误原因
你定义的Matrix[x, y: static[int], T]类型中,x和y是编译时静态参数,要求它们的值必须在编译阶段就能确定。但你在readFile过程中从文件读取graph_size,这个值是运行时才会得到的,编译器无法在编译阶段知晓它的具体数值,因此抛出了“can't evaluate at compile time”错误。
另外你的代码还有两处问题:
- 全局变量
n、m会导致多次调用readFile时状态混乱,应该改为局部变量 - 原
Matrix类型未定义二维索引器,直接用whole_graph[n][m]会触发语法错误
解决方案
改用动态尺寸的矩阵结构,把矩阵的行列数作为对象的成员变量,用seq(Nim中动态大小的序列类型)存储数据,适配运行时确定的尺寸。
修改后的代码示例:
import strutils type Matrix[T] = object rows, cols: int data: seq[T] # 实现二维索引器,支持通过[row][col]访问矩阵元素 proc `[]`[T](m: var Matrix[T], row: int): var seq[T] = result = m.data.slice(row*m.cols ..< (row+1)*m.cols) proc readFile(): Matrix[int] = let f = open("matrix.txt") defer: f.close() let graph_size = parseInt(f.readline()) # 初始化矩阵:设置行列数,预分配对应大小的存储 result.rows = graph_size result.cols = graph_size result.data = newSeq[int](graph_size * graph_size) var n = 0 for line in f.lines: var m = 0 for field in line.splitWhitespace: let cell = parseInt(field) result[n][m] = cell inc m inc n let whole_graph = readFile()
修改说明
- 重新定义
Matrix[T]:移除静态参数,新增rows、cols成员存储动态尺寸,data用seq[T]存储元素,适配运行时确定的大小 - 实现
[]索引器:让矩阵可以像二维数组一样通过[row][col]的方式访问元素 - 局部化变量
n、m:避免全局状态带来的潜在问题 - 调整
readFile为返回Matrix[int]:方便外部获取并使用读取后的矩阵
内容的提问来源于stack exchange,提问作者dromologue
相关产品推荐
相关产品推荐

