初始化一系列seqs

Tim*_*ara 5 nimrod nim-lang

我是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
Run Code Online (Sandbox Code Playgroud)

我试过的其他方法似乎更接近......

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
Run Code Online (Sandbox Code Playgroud)

......但现在我正打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
Run Code Online (Sandbox Code Playgroud)

...我究竟做错了什么?

def*_*ef- 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
Run Code Online (Sandbox Code Playgroud)


Tim*_*ara 5

成功!

事实证明,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
Run Code Online (Sandbox Code Playgroud)