2015-05-18 12 views
5

Jestem nowy dla Nima i wpadam na kilka problemów. Poniższy kod powoduje SIGSEGV: Illegal storage access. (Attempt to read from nil?). Nie potrafię wymyślić, jak zapełnić sekwencję sekwencji wartościami.Inicjalizuj kolejne seqy

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 

Inne podejścia Mam próbowali wydają się być bliżej ...

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 

... ale teraz jestem uderzanie 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 

... Co ja robię źle?

Odpowiedz

8

Jeśli nie chcesz, aby zmienić rozmiar nast łatwiejsze rozwiązanie jest jej przydzielenia:

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

Niesamowite . Dziękujemy za poświęcenie czasu na odpowiedź! Wiedziałem, że coś tam będzie! –

4

Sukces!

Okazuje się, że Nim naprawdę nie lubi używania nawiasów kwadratowych w miejscach, w których dane jeszcze nie istnieją. To będzie wysadzić matrix[i] = item. Jednak matrix.add(item) będzie działać dobrze.

Oto jak skończyło się tworząc tablicę 2D w 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