Nim编译报错:为何期望Ordinal类型而非Board类型?
解决Nim中类型不匹配的编译错误
环境与编译信息
- Nim版本:1.6.8
- 编译命令:
nim c ./myfile.nim
已尝试的无效方案
- 在Board参数前添加
var(实际无需修改Board) - 在proc名称后添加
[Board]标识所属类型 - 修改result变量名并返回
完整错误信息
Error: type mismatch: got
<proc (x: openArray[Board]): int{.noSideEffect.}>
but expected one of:
proc inc[T: Ordinal](x: var T; y = 1)
first type mismatch at position: 1
required type for x: var T: Ordinal
but expression 'res' is of type: proc (x: openArray[Board]): int{.noSideEffect.}
相关代码
import strutils import sequtils const Rows = 1000 Cols = 1000 type Row = array[Cols, bool] Board = array[Rows, Row] # 无错误的另一个proc proc toggle(b:var Board, start:tuple, last:tuple) = for c in start[0]..last[0]: for r in start[1]..last[1]: b[c][r] = not b[c][r] proc onLights(b:Board):int{.noSideEffect.} = var result = 0 for c in low[b] .. high[b]: result += low[c].count(true) var lights:Board echo lights.onLights() # 预期输出0
问题原因与解决方法
错误的核心是onLights过程中low[c]的写法错误:
这里的c是Board数组的索引(整数类型),low[c]会被Nim解析为调用内置的low过程并传入c,但我们实际需要的是访问Board中索引为c的那一行(即b[c]),然后统计该行中true的数量。
修改onLights过程中的对应代码行即可解决问题:
proc onLights(b:Board):int{.noSideEffect.} = var result = 0 for c in low[b] .. high[b]: result += b[c].count(true) # 将low[c]改为b[c]
另外,也可以用更简洁的遍历方式替代索引循环,代码可读性更好:
proc onLights(b:Board):int{.noSideEffect.} = var result = 0 for row in b: result += row.count(true)
内容的提问来源于stack exchange,提问作者depperm
相关产品推荐
相关产品推荐

