Как передать ссылку на двумерный массив функции? - программирование
Подтвердить что ты не робот

Как передать ссылку на двумерный массив функции?

Я пытаюсь передать ссылку на двумерный массив на функцию в С++. Я знаю размер обоих измерений во время компиляции. Вот что я имею прямо сейчас:

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

Что означает эта ошибка и как ее исправить?

4b9b3361

Ответ 1

Если вы знаете размер во время компиляции, это сделает это:

//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]), таким образом, просто sizeof указателя.

Ответ 2

Хотя вы можете передать ссылку на массив, потому что массивы распадаются на указатели в вызовах функций, когда они не привязаны к ссылочным параметрам, и вы можете использовать указатели точно так же, как массивы, чаще используется массивы в вызовах функций, таких как это:

void ModifyArray( int arr[][80] ); 

или эквивалентно

void ModifyArray( int (*arr)[80] );

Внутри функции arr может использоваться почти так же, как если бы объявление функции:

void ModifyArray( int (&arr)[80][80] );

Единственный случай, когда это не выполняется, - это когда вызываемой функции требуется статически проверенная гарантия размера первого индекса массива.

Ответ 3

Возможно, вы захотите попробовать cdecl или С++ 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

Ответ 4

Синтаксис неверен.

Давайте возьмем пример 1D Array

 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]); 

Ответ 5

Я думаю, что это то, что вы хотите:

void do_something(int array[board_width][board_height]);

Вы не можете передать массив ссылок на функцию.