Странная ошибка, при которой значение многомерного массива "пропускается"
Я пытаюсь реализовать функцию, которая ищет многомерный массив, выясняет, есть ли в нем значение, а затем перемещает эту функцию. Моя функция поиска
bool search(int value, int values [][d], int n)
{
bool In = false;
//d is an it that is the maximum length and height
//e.g 3x3 or 4x4 as in the image below
for(int row=0; row<d; row++)
{
for(int col=0; col<d; col++)
{
if(values[row][col] == value)
{
//checking if this loop is executed
printf("EXECUTED!! :) \n");
In=true;
}
printf("Row:%i & Col%i: %i \n",row,col,values[row][col]);
}
}
//Usleep for debugging purpouses
// as another function clears the screen
usleep(50000000);
if(In==true){return true;}
if(In==false){return false;}
}
Это то, что напечатано, что странно, так как печатать поле 4х4 выше, я использовал тот же массив, и функция поиска не изменяет массив в любом случае. Это моя функция "двигаться"
bool move(int tile)
{
if(search(tile,board,d))
{
printf("please execute this code pretty please clang\n");
return true;
}
else
{
printf("NOO\n");
return false;
}
}
А вот функция, которая инициализирует переменную в первую очередь
void init(void)
{
bool even;
if((d & 1) == 0)
{
even = true;
}
else
{
even = false;
}
int value = d*d - 1;
for(int row =0; row<d; row++)
{
for(int col=0; col<d; col++)
{
board[row][col]=value;
value--;
}
}
//for this game to work if d is even the values of the third
// and second last arrays must be switched
if(even==true)
{
int temp = board[d-1][d-2];
board [d-1][d-2] = board[d-1][d-3];
board [d-1][d-3] = temp;
}
}
РЕДАКТИРОВАТЬ: Вот пастбина для полного кода http://pastebin.com/yS8DDEqZ Примечание. Cs50 - это пользовательская библиотека, которая была реализована принимающим классом, она определяет строку вспомогательные функции, которые получают пользовательский ввод GetInt() и т. Д.
1 ответ
Хорошо, я понял.
Вы определенно используете совместимый с C99 компилятор, который допускает массивы переменной длины.
Соответствующие выдержки из вашего кода:
#define MAX 9
int board[MAX][MAX]; // <- board is an int[9][9]
int d; // <- d is a global variable
bool search(
int value,
int values[MAX][d], // <- tells compiler to handle values as int[9][d]
int n);
// from within init()
for(int row =0; row<d; row++)
for(int col=0; col<d; col++)
board[row][col]=value--; // <- board inited as an int[9][9]
Массив фиксированного размера - это большой кусок непрерывной памяти, строки которого хранятся одна за другой.
Пример:
int a[2][3]
хранится как 6 дюймов, что соответствует:
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
Вот board
расположение памяти 9x9:
000000000
111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
или в линейной памяти:
000000000111111111222222222333333333444444444555555555666666666777777777888888888
Теперь, если d равно 4, как показано на скриншоте, функция поиска будет думать, что ее расположение:
0000
1111
2222
3333
4444
5555
6666
7777
8888
или в линейной памяти:
000011112222333344445555666677778888
Ваша функция инициализации использует макет 9x9, поэтому она помещает значения следующим образом:
15 14 13 12 x x x x x
11 10 9 8 x x x x x etc.
но ваша функция поиска читает их как:
15 14 13 12
x x x x
x 11 10 9
8 x x x
etc.
По сути, вы объявили структуру для вашего массива в прототипе search()
это не соответствует его заявлению.
Вы безрассудно нарушили одно из малоизвестных золотых правил C:
всегда держите параметры функций и объявления массивов согласованными.
и С наказал вас загадочной ошибкой.
Прочитайте мое маленькое эссе для более подробной информации.