2015-05-18 9 views
5

Ich bin brandneu zu Nim und stoße auf einige Probleme. Der folgende Code führt zu SIGSEGV: Illegal storage access. (Attempt to read from nil?). Ich kann nicht herausfinden, wie man eine Sequenz von Sequenzen mit Werten bevölkert.Initialisiere eine Seq von Seqs

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 

Andere Ansätze, die ich versucht habe scheinen näher zu sein ...

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 

... aber jetzt out of bounds [IndexError] Ich schlage ...

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 

... Was mache ich falsch?

Antwort

8

Wenn Sie möchten, um die Seq nicht die Größe, eine einfachere Lösung ist es vorzubelegen:

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 
+0

Ehrfürchtig . Danke, dass du dir die Zeit genommen hast zu antworten! Ich wusste, dass da draußen etwas wäre! –

4

Erfolg!

Es stellt sich heraus, dass es Nim wirklich nicht gefällt, dass Sie eckige Klammern an Stellen verwenden, an denen Daten noch nicht existieren. Das ist matrix[i] = item wird explodieren. matrix.add(item) wird jedoch gut funktionieren.

Hier ist, wie ich ein 2D-Array in Nim Schaffung endete:

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