2016-10-17 4 views
-1

ConwayのGame of LifeをCで再現する課題があります。次のコードでは、2Dで指定された座標に隣接するものが存在するかどうかを確認しようとしています「canGoUP」または「canGoDown」などは、2Dアレイのエッジ近くにある座標かどうかをチェックすることによりセグメンテーション違反を防止するという名前CのGame of Lifeのレクリエーションにおける隣人の状態を確認

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; 
} 

機能:-arrayは生死状態を有しています。何らかの理由で、コードがほぼ完璧に動作していません。私は隣人のいくつかの兆候を得るが、それは私に正しい量をほとんど決して伝えることはありません。問題についてもっと良い方法がありますか?または私はちょうどコードで何かを逃したことがありますか?

+2

'cell field [i] [j]'は 'cell field [rows] [cols]'である必要があります。 – user3386109

+0

私は、forループでcheckNeighbor関数が使用されていると述べるべきです。そうすれば、私はすべての座標を調べて、それぞれの座標を調べることができます。そのため、行と列はiとjで表されます。 – Crocus

+1

はい、コンパイラに 'field'配列の大きさを伝える必要があります。 'i'と' j'が0のときは、配列が0x0エントリであることをコンパイラに伝えます。しかし実際には、配列には固定サイズがあります。それが明確でない場合は、関数の署名 'int checkNeighbor(int i、int j、cell field [i] [j])を' 'int checkNeighbor(int i、int j、cellフィールド[行] [列]) '。関数の本体は問題ありません。 – user3386109

答えて

1

この関数は、field行列の大きさと誤っています。 fieldiの行とjの列を持っていると考えています。しかしそれは正しいわけではありません。いくつかの行数と列数が多分あるでしょう。

たとえば、i==0j==0でこの関数を呼び出すと、その呼び出しの配列宣言はcell field[0][0]、つまり無効な空の配列になります。

追加のパラメータとして実際の寸法を渡し、配列サイズのものを使用する必要があります。

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

'canGo ...'関数に基づいて、 'rows'と' cols'は大域変数か '#define'定数のどちらかと言います。 – user3386109

関連する問題