You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:46:13