2010-04-11 6 views
1

Je travaille sur un programme où j'essaie de transmettre des paramètres par référence. J'essaie de passer un tableau int 2D et un tableau de caractères 1D par référence.Erreurs/avertissements passant int/char tableaux par référence

prototype Fonction:

void foo (int* (&a)[2][2], char* (&b)[4]) 

appel Fonction:

foo (a, b); 

Cependant, quand je compile le code avec -ansi et -Wall drapeaux sur gcc, je reçois les erreurs suivantes:

foo.c: At top level: 
error: expected ‘)’ before ‘&’ token 
error: expected ‘;’, ‘,’ or ‘)’ before ‘char’ 
foo.c: In function ‘main’: 
error: too many arguments to function ‘foo’ 

J'ai enlevé le reste du code de mon programme et concentra té sur les bits qui jettent les erreurs. J'ai cherché autour de StackOverflow et essayé différentes façons de passer les paramètres, mais aucun d'entre eux ne semble fonctionner. (I took this way of passing parameters from the discussion on StackOverflow here.)

Pourriez-vous s'il vous plaît me dire où je vais mal?

Répondre

4

Les références ne font pas partie du langage C, la syntaxe que vous essayez d'utiliser ne fonctionne qu'en C++.

Incidemment, char* (&b)[4] serait une référence à un tableau de quatre char* qui est un tableau 1D de char*, pas un tableau 1D de char.

Typiquement, une fonction prenant un tableau 2D de int s et un tableau 1D de char sera déclarée comme

void foo(int a[][2], char b[]); 

qui est le même que:

void foo(int (*a)[2], char *b); 
+0

Alors ... Je ne peux pas passer un tableau par référence en C? –

+0

Non, vous pouvez avoir des références dans n'importe quel contexte dans C. Vous ne pouvez pas non plus transmettre des tableaux par valeur; ils se décomposent toujours en pointeurs vers leur premier élément lorsqu'ils sont passés aux fonctions. –

+1

En C, sa valeur passe toujours.En savoir plus sur la désintégration des tableaux en pointeurs. http://stackoverflow.com/questions/2448204/why-does-this-generate-a-segmentation-fault/2448255#2448255 –

1

Tout d'abord, comme dit Charles, C n'a pas de références. Mais normalement, vous pouvez remplacer les références par des pointeurs et obtenir des résultats équivalents grâce à une syntaxe légèrement différente.

Deuxièmement, votre description indiquait que vous essayiez de passer un tableau 2D int, mais votre déclaration suggère qu'il s'agissait en fait d'un tableau de pointeurs int *. Alors, qu'est-ce que c'était censé être, un tableau de int ou un tableau de int *?

En supposant que vous vouliez un tableau de int (et un tableau de char), la variante avec des pointeurs à tableau au lieu de références à tableau pourrait se présenter comme suit

void foo(int (*a)[2][2], char (*b)[4]); 

Fondamentalement la même syntaxe que vous avez utilisé, mais avec * au lieu de &. À l'intérieur de la fonction, les éléments du tableau seraient accessibles en tant que (*a)[i][j] et (*b)[k].

Cette fonction sera appelée comme indiqué ci-dessous

int a[2][2]; 
char b[4]; 
... 
foo(&a, &b); 
+0

Merci, AndreyT. Je comprends la différence entre les deux types de tableaux de passes maintenant. –

Questions connexes