web-dev-qa-db-fra.com

Comment passer une référence à un tableau à deux dimensions à une fonction?

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?

25
Nathan Stoddard

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.

36

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.

23
CB Bailey

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
6
Mr.Ree

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]); 
1
Giriraj Pawar

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.

0
Jeremy Ruten