2016-10-17 5 views
-1

Conway의 C of Life in Life를 재 작성하는 과제가 있습니다. 다음 코드에서 2D의 주어진 좌표에 이웃이 있는지 확인하려고합니다. "canGoUP"또는 "canGoDown"등은이 2 차원 어레이의 에지 근처 좌표가 확인하여 세그먼테이션 폴트 (segfault) 방지라는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 죽거나 ALIVE 상태를 갖는다. 자, 어떤 이유로 코드가 거의 완벽하게 작동하지 않습니다. 나는 이웃 사람의 표시를 얻는다 그러나 그것은 나에게 적당한 양을 거의 이야기하지 않는다. 문제를 해결할 더 좋은 방법이 있습니까? 아니면 코드에서 뭔가를 놓친 적이 있습니까?

+2

'cell field [i] [j]'는'cell field [rows] [cols]'이어야합니다. – user3386109

+0

for-loop에서 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 field [rows] [cols])'를 호출합니다. 함수의 몸체는 괜찮습니다. – user3386109

답변

1

이 함수는 field 행렬의 크기가 잘못되었습니다. field에는 i 개의 행과 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'는 전역 변수이거나'#defined' 상수라고 말하고 싶습니다. – user3386109