2016-10-17 2 views
-1

Ich habe eine Aufgabe Conways Spiel des Lebens in C neu zu erstellen. Im folgenden Code versuche ich zu überprüfen, ob die Nachbarn zu einer gegebenen Koordinate in einem 2D -array hat den Status tot oder lebendig:Überprüfen Sie den Status der Nachbarn in der Wiederherstellung von Game of Life in C

int checkNeighbor(int i, int j, cell field[i][j]) { 
    int sum=0; 


    if(canGoUp(i) && canGoLeft(j) && (field[i-1][j-1].current == ALIVE)) { 
     sum++; 
    } 
    if(canGoUp(i) && (field[i-1][j].current == ALIVE)) { 
     sum++; 
    } 
    if(canGoUp(i) && canGoRight(j) && (field[i-1][j+1].current == ALIVE)) { 
     sum++; 
    } 
    if(canGoRight(j) && (field[i][j+1].current == ALIVE)) { 
     sum++; 
    } 
    if(canGoDown(i) && canGoRight(j) && (field[i+1][j+1].current == ALIVE)) { 
     sum++; 
    } 
    if(canGoDown(i) && (field[i+1][j].current == ALIVE)) { 
     sum++; 
    } 
    if(canGoDown(i) && canGoLeft(j) && (field[i+1][j-1].current == ALIVE)) { 
     sum++; 
    } 
    if(canGoLeft(j) && (field[i][j-1].current == ALIVE)) { 
     sum++; 
    } 

    return sum; 
} 

die Funktionen Namen „canGoUP“ oder „canGoDown“ etc verhindert segfaults durch Prüfen, ob die in der Nähe der Kante des 2D-Array koordinieren. Nun, aus irgendeinem Grund funktioniert der Code nicht annähernd perfekt. Ich bekomme Hinweise auf Nachbarn, aber es sagt mir fast nie die richtige Menge. Gibt es einen besseren Weg, um das Problem zu lösen? oder habe ich gerade etwas im Code verpasst?

+2

'Zellenfeld [i] [j]' 'braucht Zellenfeld [Zeilen] [cols]' zu sein. – user3386109

+0

Ich hätte erwähnen sollen, dass die checkNeighbor-Funktion in einer For-Schleife verwendet wird. Auf diese Weise kann ich alle Koordinaten durchgehen und für jeden die Nachbarn überprüfen. Deshalb werden Zeilen und Spalten durch i und j dargestellt. – Crocus

+1

Ja, aber Sie müssen dem Compiler mitteilen, wie groß das Array 'field' ist. Wenn 'i' und' j' 0 sind, sagen Sie dem Compiler, dass das Array 0x0 Einträge ist. Aber tatsächlich hat das Array eine feste Größe. Falls es nicht klar ist, sage ich, dass Sie die Funktionssignatur 'int checkNeighbor (int i, int j, Zellenfeld [i] [j])' zu 'int checkNeighbor (int i, int j, Zelle) ändern müssen Feld [Zeilen] [Spalten]) '. Der Körper der Funktion ist in Ordnung. – user3386109

Antwort

1

Diese Funktion ist falsch, wie groß die field Matrix ist. Es glaubt, field hat i Zeilen und j Spalten. Das ist jedoch nicht korrekt. Es hat wahrscheinlich eine größere Anzahl von Zeilen und Spalten. Wenn Sie diese Funktion mit i==0 und j==0 aufrufen, lautet die Array-Deklaration für diesen Aufruf cell field[0][0], d.

Sie müssen die tatsächlichen Dimensionen als zusätzliche Parameter übergeben und diese für die Array-Größe verwenden.

int checkNeighbor(int i, int j, int rows, int cols, cell field[rows][cols]); 
+1

Basierend auf den 'canGo ...' - Funktionen würde ich sagen, dass die 'rows' und' cols' entweder globale Variablen oder '# defined' Konstanten sind. – user3386109

Verwandte Themen