У меня эта очень странная проблема. Функция, которую вы увидите в данный момент, должна гарантировать, что все элементы (символы) в 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". Затем функция заменяет все символы, связанные с пробелом. Затем в последней части изображения вы можете увидеть, как символы удаляются. Плата, у которой нет границы, есть потому, что я использовал ее, чтобы проверить, действительно ли символы были удалены или нет. Благодарим вас за продвинутый 1, прочитав весь этот пост и 2, любую помощь, которую вы можете дать.
Поскольку вы сравниваете текущую строку со следующей строкой, вы должны использовать for(i = 0; я < board->rows-1; i++)
Затем в вашем сложном операторе if избавиться от && я <= board->rows
. Это должно было быть меньше, чем в любом случае, не меньше или равно. Вы выходите из пределов и получаете мусор в своем массиве.
Вы проверяете строку за пределами максимального количества строк.
(board-> boardDim [i + 1] [j]! = None && я + 1 <= board-> rows) Эта память не гарантируется равной 0. Если это не 0, ваша функция будет заменять ее Если он не читается человеком, printf ничего не печатает для него, тем самым перемещая | налево.
i + 1 <= board->rows
не кажутся многообещающими.