2008-12-31 7 views
22

J'essaie de passer une référence à un tableau bidimensionnel à une fonction en C++. Je connais la taille des deux dimensions au moment de la compilation. Voici ce que j'ai en ce moment:Comment transmettre une référence à un tableau bidimensionnel à une fonction?

const int board_width = 80; 
const int board_height = 80; 
void do_something(int[board_width][board_height]& array); //function prototype 

Mais cela ne fonctionne pas. Je reçois cette erreur de g ++:

error: expected ‘,’ or ‘...’ before ‘*’ token 

Qu'est-ce que cette erreur signifie, et comment puis-je résoudre ce problème?

Répondre

0

Je pense que c'est ce que vous voulez:

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

Vous ne pouvez pas passer un tableau de références à une fonction.

+1

contredit la meilleure réponse –

+3

* Vous ne pouvez pas passer un tableau de références à une fonction. * True mais vous pouvez passer une référence à un tableau. –

30

Si vous connaissez la taille au moment de la compilation, ce 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 fait un pointeur vers le premier sous-ensemble des deux dimensions array ("board_width" est complètement ignoré, comme dans le cas dégénéré d'avoir une seule dimension quand vous avez int array[] acceptant un pointeur), ce qui n'est probablement pas ce que vous voulez (parce que vous avez explicitement demandé une référence). Ainsi, le faire avec la référence, en utilisant sizeof sur le paramètre sizeof array donnera sizeof(int[board_width][board_height]) (comme si vous le feriez sur l'argument lui-même) tout en le faisant avec la seconde méthode (en déclarant le paramètre comme tableau, ce qui le transformait en un pointeur) donnera sizeof(int(*)[board_height]), donc simplement la taille d'un pointeur.

6

Vous pouvez 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 
+0

réponse originale. –

+0

Ceci est également disponible en ligne: https://cdecl.org/ – rvighne

20

Bien que vous puissiez passer une référence à un tableau, car la décomposition des tableaux de pointeurs en fonction appelle quand ils ne sont pas liés à un des paramètres de référence et vous pouvez utiliser des pointeurs comme des tableaux, il est plus courant d'utiliser des tableaux en fonction des appels comme ceci:

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

ou équivalente

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

dans la fonction, arr peut être utilisé de la même façon que si la déclaration de fonction étaient:

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

Le seul cas où cela ne tient pas est lorsque la fonction appelée a besoin d'une garantie vérifiée statiquement de la taille du premier index du tableau.

0

La syntaxe n'est pas correcte.

Prenons un exemple de tableau 1D

int a[] = {1,2,3}; 
int (&p) [3] = a; 

de sorte que vous pouvez faire comme ci-dessous pour le tableau 2D

const int board_width = 80; 
const int board_height = 80; 
void do_something(int (&array) [board_width][board_height]); 
Questions connexes