初始化一个seq的seq

Initialize a seq of seqs

我是 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

...我做错了什么?

成功!

事实证明,Nim 真的不喜欢你在数据尚不存在的地方使用方括号。即matrix[i] = item会爆炸。但是,matrix.add(item) 会很好用。

以下是我最终在 Nim 中创建二维数组的方式:

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

如果您不想调整 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