c++ - referencia - parametro matriz c
¿Cómo paso una referencia a una matriz bidimensional a una función? (5)
Estoy tratando de pasar una referencia a una matriz bidimensional a una función en C ++. Sé el tamaño de ambas dimensiones en tiempo de compilación. Esto es lo que tengo ahora:
const int board_width = 80;
const int board_height = 80;
void do_something(int[board_width][board_height]& array); //function prototype
Pero esto no funciona. Obtengo este error de g ++:
error: expected ‘,’ or ‘...’ before ‘*’ token
¿Qué significa este error y cómo puedo solucionarlo?
Aunque puede pasar una referencia a una matriz, porque las matrices decaen a punteros en las llamadas a funciones cuando no están vinculadas a los parámetros de referencia y puede usar punteros al igual que las matrices, es más común usar matrices en llamadas a funciones como esta:
void ModifyArray( int arr[][80] );
o equivalente
void ModifyArray( int (*arr)[80] );
Dentro de la función, arr puede usarse de forma muy similar a como si la declaración de la función fuera:
void ModifyArray( int (&arr)[80][80] );
El único caso en el que esto no se cumple es cuando la función llamada necesita una garantía comprobada estáticamente del tamaño del primer índice de matriz.
Creo que esto es lo que quieres:
void do_something(int array[board_width][board_height]);
No puede pasar una serie de referencias a una función.
Es posible que desee probar cdecl o 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
La sintaxis no es correcta
Tomemos un ejemplo de 1D Array
int a[] = {1,2,3};
int (&p) [3] = a;
para que pueda hacer lo siguiente para la matriz 2D
const int board_width = 80;
const int board_height = 80;
void do_something(int (&array) [board_width][board_height]);
Si conoce el tamaño en tiempo de compilación, esto lo hará:
//function prototype
void do_something(int (&array)[board_width][board_height]);
Haciéndolo con
void do_something(int array[board_width][board_height]);
Pasará realmente un puntero a la primera sub-matriz de la matriz de dos dimensiones ("board_width" se ignora por completo, como con el caso degenerado de tener solo una dimensión cuando tienes int array[]
aceptando un puntero), que probablemente no sea lo que quiere (porque explícitamente pidió una referencia). Por lo tanto, al hacerlo con la referencia, al usar sizeof en el parámetro sizeof array
obtendrá sizeof(int[board_width][board_height])
(como si lo hiciera en el argumento mismo) mientras lo hace con el segundo método (declarando el parámetro como matriz, haciendo que el compilador lo transforme en un puntero) producirá sizeof(int(*)[board_height])
, por lo tanto, simplemente el tamaño de un puntero.