6

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

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

4

2 回答 2

9

如果您不想调整 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
于 2015-05-18T09:27:28.247 回答
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
于 2015-05-18T09:00:43.093 回答