2014-11-14 3 views
0

나는이 이상한 문제가 계속 발생합니다. 잠시 후에 볼 수있는 기능은 2D 배열의 모든 요소 (문자)가 최대한의 위치에 있는지, 즉 문자 위에 빈 공간이 없는지 확인하는 것입니다. 예를 들어, 보드 모양은 다음과 같습니다.정렬 기능 배열 부분 삭제 C

1 X * * X^
2 * X^* 
3 o o * X^
4 o^X X X 
5^* X *^
    1 2 3 4 5 

비어있는 공간 위에 빈 공간이 있으므로 (2,1)에 문제가 있습니다.

내 함수는 올바르게 정렬하지만 맨 아래 행에 공백이있는 문자는 삭제합니다. 나는 내 삶을 위해서 왜 그런지 알아낼 수 없다. 여기에 내 정렬 기능이 있습니다.

int bb_float_one_step(BBoard board){ 
int i,j; 
for (i = 0; i < board->rows; i++){ 
    for (j = 0; j < board->cols; j++){ 
     if (board->boardDim[i][j] == None && (board->boardDim[i + 1][j] != None && i + 1 <= board->rows)){ 
      char tmp = board->boardDim[i + 1][j]; 
      board->boardDim[i + 1][j] = board->boardDim[i][j]; 
      board->boardDim[i][j] = tmp; 
      } 
     } 
    } 
    for (i = 0; i < board->rows; i++){ 
    for (j = 0; j < board->cols; j++){ 
    printf("%c",board->boardDim[i][j]);}printf("\n");} 
} 

이하 전체 프로그램 사진이 있습니다. 프로그램에서 보드를 인쇄합니다. 사용자가 '팝업'할 영역을 선택하라는 메시지가 나타납니다. 함수는 공백으로 연결된 모든 문자를 바꿉니다. 그러면 그림의 마지막 부분에서 문자가 삭제 된 방법을 볼 수 있습니다. 문자가 실제로 삭제되었는지 여부를 확인하기 위해 국경이없는 보드가 있습니다. enter image description here 1에 대한 진보에 감사 드리며,이 전체 게시물을 읽고 2, 당신이 줄 수있는 도움. 당신이 다음 행으로 현재 행을 비교하기 때문에 문이, && i <= board->rows 제거하면

+1

'i + 1 <= board-> rows'는 유망하지 않습니다. – WhozCraig

+0

그래서 당신이하려는 것은 모든 빈 공간을 제거한 다음 그 빈 공간을 배열의 마지막 (마지막 행)으로 옮기는 것입니다. 그렇다면 보드를 1 차원 배열로 구현하면 공간을 끝으로 이동하고 나머지 문자를 "함께 묶는"간단한 함수 호출이됩니다. – PaulMcKenzie

+0

디버거는 친구입니다. 사용하고 계십시오. –

답변

2

당신은 당신의 단지에 그런 for(i = 0; i < board->rows-1; i++) 를 사용해야합니다. 그것은 어쨌든 덜 - 같거나 - 같지 않아야합니다. 경계선을 벗어나서 쓰레기를 가져옵니다.

+0

그게 다야, 고마워. –

2

최대 행 수를 초과하는 행을 확인하고 있습니다. (board-> boardDim [i + 1] [j]! = 없음 & & i + 1 < = board-> rows) 메모리가 0으로 보장되지 않습니다. 0이 아닌 경우 함수가 사람이 읽을 수 없다면, printf는 아무것도 인쇄하지 않으므로 | 왼쪽으로.