Если у вас есть доступный компилятор C99 или C11, вы можете передать оба измерения массива в качестве аргументов перед параметром массива, как показано в ThoAppelsin ответ от.
Если вы застряли с компилятором C89, вам придется работать еще усерднее. Безусловно, самое простое решение — сделать #define
измерения доступными в заголовке; тогда вы можете написать:
int function(grid[HEIGHT][WIDTH]) { ... }
int function(grid[][WIDTH]) { ... }
Если вы не можете этого сделать, вам придется подумать об изменении либо кода в функции, либо структур данных в main.c
.
Изменение функции означает:
int function(int height, int width, int *grid)
{
int i, j;
for (i = 0; i < height; i++)
for (j = 0; j < width; j++)
grid[i*width + j] = 0;
return j;
}
Это берет обычный указатель на-int
и явно выполняет вычисления индекса, а не просто записывает два индекса. Ваш основной код может иметь:
int grid[HEIGHT][WIDTH];
i = function(HEIGHT, WIDTH, &grid[0][0]);
В качестве альтернативы вы создаете вторичную структуру, набор указателей на указатели, в main()
:
int grid_rows[HEIGHT];
for (i = 0; i < HEIGHT; i++)
grid_row[i] = grid[i];
i = function(HEIGHT, WIDTH, grid_rows);
Теперь определение такое:
int function(int height, int width, int **grid)
{
int i, j;
for (i = 0; i < height; i++)
for (j = 0; j < width; j++)
grid[i][j] = 0;
return j;
}
Это восстанавливает удобство записи в функции за счет дополнительной памяти и инициализации.
person
Jonathan Leffler
schedule
12.07.2014