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

Я пытаюсь передать ссылку на двумерный массив функции на 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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
26
0
74 735
5

Ответы 5

Думаю, это то, что вам нужно:

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

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

противоречит лучшему ответу

Sriram Murali 18.09.2013 19:53
Вы не можете передать массив ссылок на функцию. Истинно, но вы можете передать ссылку на массив.
R Sahu 27.12.2015 23:43

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

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

Другие вопросы по теме