2014-11-14 2 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");} 
} 

Ниже представлена ​​картинка в полный цикл. Программа печатает плату. Пользователю предлагается выбрать регион для «pop». Затем функция заменяет все символы, связанные с пробелом. Затем в последней части изображения вы можете увидеть, как символы удаляются. Плата, у которой нет границы, есть потому, что я использовал ее, чтобы проверить, действительно ли символы были удалены или нет. enter image description here Благодарим вас за продвинутый 1, прочитав весь этот пост и 2, любую помощь, которую вы можете дать.

+1

'i + 1 <= board-> строк' не кажется многообещающим. – WhozCraig

+0

Итак, что вы пытаетесь сделать, это удалить все пустые пространства, а затем переместить эти пустые пространства в конец массива (последняя строка). Если это так, если вы внедрили свою доску в качестве массива с 1-м массивом, она станет простым вызовом функции для перемещения пробелов до конца и «сжимания» оставшихся символов. – PaulMcKenzie

+0

Отладчики - ваши друзья, попробуйте использовать их. –

ответ

2

Поскольку вы сравниваете текущую строку со следующей строкой, вы должны использовать for(i = 0; i < board->rows-1; i++) Тогда в вашем сложном операторе if избавиться от && i <= board->rows. Это должно было быть меньше, чем в любом случае, не меньше или равно. Вы выходите из пределов и получаете мусор в своем массиве.

+0

Вот оно, спасибо. –

2

Вы проверяете строку за пределами максимального количества строк.
(доска-> панель Dim [i + 1] [j]! = None & & i + 1 < = board-> rows) Эта память не гарантируется 0. Если это не 0, ваша функция будет заменой он внутри. Если он не читается человеком, printf ничего не печатает для него, тем самым переместите | налево.