Ако имате наличен 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