初始化一系列seqs

时间:2015-05-18 09:00:43

标签: nim nimrod

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

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

2 个答案:

答案 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