Я пытаюсь передать ссылку на двумерный массив функции на C++. Я знаю размер обоих измерений во время компиляции. Вот что у меня есть прямо сейчас:
const int board_width = 80;
const int board_height = 80;
void do_something(int[board_width][board_height]& array); //function prototype
Но это не работает. Я получаю эту ошибку от g ++:
error: expected ‘,’ or ‘...’ before ‘*’ token
Что означает эта ошибка и как ее исправить?





Думаю, это то, что вам нужно:
void do_something(int array[board_width][board_height]);
Вы не можете передать массив ссылок на функцию.
Если вы знаете размер во время компиляции, это сделает это:
//function prototype
void do_something(int (&array)[board_width][board_height]);
Делая это с
void do_something(int array[board_width][board_height]);
Фактически передаст указатель на первый подмассив двумерного массива («board_width» полностью игнорируется, как и в вырожденном случае наличия только одного измерения, когда int array[] принимает указатель), что, вероятно, не то, что вам нужно. (потому что вы явно просили ссылку). Таким образом, выполняя это со ссылкой, используя sizeof для параметра sizeof array, вы получите sizeof(int[board_width][board_height]) (как если бы вы сделали это с самим аргументом), при этом выполняя это вторым методом (объявляя параметр как массив, что заставляет компилятор преобразовать его в указатель) даст sizeof(int(*)[board_height]), то есть просто размер указателя.
Вы можете попробовать cdecl или C++ decl.
% c++decl
c++decl> declare i as reference to array 8 of array 12 of int
int (&i)[8][12]
c++decl> explain int (&i)[8][12]
declare i as reference to array 8 of array 12 of int
c++decl> exit
Хотя вы можете передать ссылку на массив, поскольку массивы распадаются на указатели в вызовах функций, когда они не привязаны к параметрам ссылки, и вы можете использовать указатели так же, как массивы, более распространено использование массивов в вызовах функций, например:
void ModifyArray( int arr[][80] );
или эквивалентно
void ModifyArray( int (*arr)[80] );
Внутри функции arr можно использовать почти так же, как если бы объявление функции было:
void ModifyArray( int (&arr)[80][80] );
Единственный случай, когда это не выполняется, - это когда вызываемой функции требуется статически проверенная гарантия размера первого индекса массива.
Неправильный синтаксис.
Давайте возьмем пример одномерного массива
int a[] = {1,2,3};
int (&p) [3] = a; // p is pointing array a
Таким образом, вы можете сделать то же самое для 2D-массива, как показано ниже.
const int board_width = 80;
const int board_height = 80;
void do_something(int (&array) [board_width][board_height]);
противоречит лучшему ответу