我是Nim的新手,并且遇到了一些问题。以下代码会生成SIGSEGV: Illegal storage access. (Attempt to read from nil?)
。我似乎无法弄清楚如何使用值填充序列序列。
const
a = @[ 0, 1, 2, 3, 4, 5]
b = @[10, 11, 12, 13, 14, 15]
var
matrix: seq[seq[int]]
for i, aa in a:
for j, bb in b:
matrix[i][j] = aa+bb
我尝试的其他方法似乎更接近......
var
matrix = newSeq[seq[int]]()
for i, aa in a:
var row = newSeq[int]()
for j, bb in b:
row[i] = aa+bb
matrix[i] = row
...但现在我正在点击out of bounds [IndexError]
......
var
matrix = newSeq[seq[int]](5)
for i, aa in a:
var row = newSeq[int](5)
for j, bb in b:
row[i] = aa+bb
matrix[i] = row
......我做错了什么?
答案 0 :(得分:8)
如果您不想调整seq的大小,更简单的解决方案是预先分配它:
import sequtils
const
a = @[ 0, 1, 2, 3, 4, 5]
b = @[10, 11, 12, 13, 14, 15]
var matrix = newSeqWith(a.len, newSeq[int](b.len))
for i, aa in a:
for j, bb in b:
matrix[i][j] = aa + bb
echo matrix
答案 1 :(得分:4)
成功!
事实证明,Nim真的不喜欢你在数据尚不存在的地方使用方括号。那是matrix[i] = item
会爆炸。但是,matrix.add(item)
会很好用。
以下是我最终在Nim中创建2D数组的方法:
var
matrix: seq[seq[int]]
row: seq[int]
matrix = newSeq[seq[int]]()
for i, aa in a:
row = newSeq[int]()
matrix.add(row)
for j, bb in b:
matrix[i].add(aa+bb)
echo matrix