2016-01-10 2 views
1

Я пытаюсь сделать sudoku solver в C. Я попытался сделать функцию для решения sudoku и затем вернуть сетку.Указатель на 2D-массив в C

void solve(int *grid){ 
    //solve sudoku 
} 

int main(){ 
    int[][] grid = { 
     {5,3,0,0,7,0,0,0,0}, 
     {6,0,0,1,9,5,0,0,0}, 
     {0,9,8,0,0,0,0,6,0}, 
     {8,0,0,0,6,0,0,0,3}, 
     {4,0,0,8,0,3,0,0,1}, 
     {7,0,0,0,2,0,0,0,6}, 
     {0,6,0,0,0,0,2,8,0}, 
     {0,0,0,4,1,9,0,0,5}, 
     {0,0,0,0,8,0,0,7,9} 
    }; 
solve(&grid); 
} 

Это не работает. Нужно взять указатель, потому что он должен отредактировать массив, а не копию Почему это?

+0

что о '*' в '* решить (&grid);'? –

+0

Указатель намеренно не называется «массив». Обратите внимание, что вы не можете передавать массивы в/из функций в С. – Olaf

+0

я подумал, что было не-указатель если это имеет смысл –

ответ

0

Прежде всего, это декларация массива

int[][] grid = { 
    {5,3,0,0,7,0,0,0,0}, 
    {6,0,0,1,9,5,0,0,0}, 
    {0,9,8,0,0,0,0,6,0}, 
    {8,0,0,0,6,0,0,0,3}, 
    {4,0,0,8,0,3,0,0,1}, 
    {7,0,0,0,2,0,0,0,6}, 
    {0,6,0,0,0,0,2,8,0}, 
    {0,0,0,4,1,9,0,0,5}, 
    {0,0,0,0,8,0,0,7,9} 
}; 

неправильно. Вы должны использовать квадратные скобки после идентификатора и указать по крайней мере количество элементов во внутреннем измерении.

#define N 9 

//... 
int grid[][N] = { 
    {5,3,0,0,7,0,0,0,0}, 
    {6,0,0,1,9,5,0,0,0}, 
    {0,9,8,0,0,0,0,6,0}, 
    {8,0,0,0,6,0,0,0,3}, 
    {4,0,0,8,0,3,0,0,1}, 
    {7,0,0,0,2,0,0,0,6}, 
    {0,6,0,0,0,0,2,8,0}, 
    {0,0,0,4,1,9,0,0,5}, 
    {0,0,0,0,8,0,0,7,9} 
}; 

Если вы хотите, чтобы передать массив в функцию, то функция может быть объявлена ​​как

void solve(int (*grid)[N], size_t n); 

и называется как

solve(grid, N); 

Примите во внимание, что массивы не имеют оператор присваивания копий, и вы не можете назначать идентификатор массива указателем.

Смежные вопросы