J'essaie de passer une référence à un tableau à deux dimensions à une fonction en C++. Je connais la taille des deux dimensions au moment de la compilation. Voici ce que j'ai en ce moment:
const int board_width = 80;
const int board_height = 80;
void do_something(int[board_width][board_height]& array); //function prototype
Mais ça ne marche pas. Je reçois cette erreur de g ++:
error: expected ‘,’ or ‘...’ before ‘*’ token
Que signifie cette erreur et comment puis-je la corriger?
Si vous connaissez la taille au moment de la compilation, cela le fera:
//function prototype
void do_something(int (&array)[board_width][board_height]);
Le faire avec
void do_something(int array[board_width][board_height]);
Passera en fait un pointeur vers le premier sous-tableau du tableau à deux dimensions ("board_width" est complètement ignoré, comme dans le cas dégénéré de n'avoir qu'une seule dimension lorsque vous avez int array[]
Acceptant un pointeur), qui est probablement pas ce que vous voulez (parce que vous avez explicitement demandé une référence). Ainsi, en le faisant avec la référence, en utilisant sizeof sur le paramètre sizeof array
, Vous obtiendrez sizeof(int[board_width][board_height])
(comme si vous le feriez sur l'argument lui-même) tout en le faisant avec la deuxième méthode (en déclarant le en tant que tableau, ce qui oblige le compilateur à le transformer en pointeur) produira sizeof(int(*)[board_height])
, donc simplement la taille d'un pointeur.
Bien que vous puissiez transmettre une référence à un tableau, car les tableaux se désintègrent aux pointeurs dans les appels de fonction lorsqu'ils ne sont pas liés à des paramètres de référence et vous pouvez utiliser des pointeurs tout comme les tableaux, il est plus courant d'utiliser des tableaux dans des appels de fonction comme celui-ci:
void ModifyArray( int arr[][80] );
ou équivalent
void ModifyArray( int (*arr)[80] );
Dans la fonction, arr peut être utilisé de la même manière que si la déclaration de fonction était:
void ModifyArray( int (&arr)[80][80] );
Le seul cas où cela ne se vérifie pas est lorsque la fonction appelée a besoin d'une garantie vérifiée statiquement de la taille du premier index du tableau.
Vous voudrez peut-être essayer cdecl ou 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 syntaxe n'est pas correcte.
Prenons un exemple de tableau 1D
int a[] = {1,2,3};
int (&p) [3] = a; // p is pointing array a
Vous pouvez donc faire de même pour un tableau 2D comme indiqué ci-dessous
const int board_width = 80;
const int board_height = 80;
void do_something(int (&array) [board_width][board_height]);
Je pense que c'est ce que vous voulez:
void do_something(int array[board_width][board_height]);
Vous ne pouvez pas transmettre un tableau de références à une fonction.