Функция сортировки Удаление части массива, C

0

У меня эта очень странная проблема. Функция, которую вы увидите в данный момент, должна гарантировать, что все элементы (символы) в 2D-массиве находятся там в крайнем положении, т.е. Нет никакого пустого пространства над любым из символов. Например, доска может выглядеть так:

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". Затем функция заменяет все символы, связанные с пробелом. Затем в последней части изображения вы можете увидеть, как символы удаляются. Плата, у которой нет границы, есть потому, что я использовал ее, чтобы проверить, действительно ли символы были удалены или нет. Изображение 174551 Благодарим вас за продвинутый 1, прочитав весь этот пост и 2, любую помощь, которую вы можете дать.

  • 1
    i + 1 <= board->rows не кажутся многообещающими.
  • 0
    Итак, вы пытаетесь удалить все пустые места и затем переместить эти пустые места в конец массива (последний ряд). Если это так, если вы реализовали свою доску в виде 1-го массива, она становится простым вызовом функции, чтобы переместить пробелы в конец и «сжать» оставшиеся символы.
Показать ещё 1 комментарий
Теги:
arrays
sorting

2 ответа

2
Лучший ответ

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

  • 0
    Вот и все, спасибо.
2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню