Bonne façon de passer 2 dimensions tableau dans une fonction
J'ai un tableau en 2 dimensions et je suis de passage dans une fonction pour réaliser certaines opérations. J'aimerais connaître la bonne façon de faire...
#define numRows 3
#define numCols 7
#define TotalNum (numRows*numCols)
int arr[numRows][numCols] = {{0,1,2,3,4,5,6}, {7,8,9,10,11,12,13},{14,15,16,17,18,19,20}};
void display(int **p)
{
printf("\n");
for (int i = 0; i< numRows;i++)
{
for ( int j = 0;j< numCols;j++)
{
printf("%i\t",p[i][j]);
}
printf("\n");
}
}
int main() {
display(arr);
}
Je reçois un message d'erreur:
'display': cannot convert parameter1 from 'int' to 'int*'
Est-ce la bonne façon de passer un tableau en 2 dimensions dans une fonction? Si non, quelle est la bonne façon?
- Voir ma réponse ci-dessous.
- double possible de C -- passage d'un tableau 2d comme un argument de fonction?
- petite astuce : utiliser des BOUCHONS pour les macros, c'est la pratique courante et peut rendre votre code beaucoup plus clair à l'extérieur
- Bien que l'intention de la question ici est de comprendre comment passer de la 2D tableaux de fonctions, pour ajouter de l'exactitude de l'exemple ci-dessus arr doit avoir été local principal.
Vous devez vous connecter pour publier un commentaire.
Vous devez déclarer votre fonction comme ceci:
Ce C FAQ explique en détail pourquoi. L'essentiel, c'est que les tableaux de désintégration dans les pointeurs une fois, il ne se passe pas de manière récursive. Un tableau de tableaux se désintègre en un pointeur sur un tableau, pas un pointeur vers un pointeur.
Si (comme dans votre cas), vous connaissez les dimensions de la matrice lors de la compilation en temps, vous pouvez écrire tout
void display(int p[][numCols])
.Quelques explications: Vous savez sans doute que lorsque vous passer un tableau à une fonction, vous fait passer un pointeur vers le premier membre. En langage C, tableau 2D est juste un tableau de tableaux. À cause de cela, vous devez passer à la fonction un pointeur vers le premier sous-tableau dans le tableau 2D. Donc, de façon naturelle, c'est de dire
int (*p)[numCols]
(qui signifie p est un pointeur vers un tableau denumCols
ints). Dans la déclaration de fonction, vous avez le "raccourci"p[]
, que signifie exactement la même chose comme(*p)
(Mais indique au lecteur, que vous passez un pointeur vers un début de tableau, et pas seulement pour une seule variable)Que vous faites dans le mauvais sens. Vous pouvez passer en 2-d tableau avec l'aide d'un pointeur sur un tableau, ou tout simplement passer un tableau ou à travers une Simple pointeur.
Il en existe plusieurs, parfois équivalent de façons de le faire. En déclarant un tableau (cf.
method_c()
), à l'aide d'un pointeur (cf.method_b()
) ou à l'aide d'un pointeur vers un tableau d'un tableau (cf.method_a()
).method_b()
, à l'aide d'un seul pointeur, est un peu plus difficile d'obtenir le droit puisqu'il n'est pas facile à utiliser standard tableau d'indexation et, par conséquent, nous utilisons l'arithmétique des pointeurs.method_a()
etmethod_c()
sont fondamentalement équivalent depuis les matrices de décomposition non-récursive à des pointeurs lors de la compilation. Voici un petit programme illustrant les trois méthodes. Nous avons d'abord initialiser un2x4
-tableauarr
dans une simple boucle for et de l'imprimer. Il ressemblera à ceci:Par la suite, nous appelons tous les trois méthodes.
method_a()
ajoute 1,method_b()
ajoute 2 etmethod_c()
ajoute 3 à tous les éléments. Après chaque appel, nous imprimer le tableauarr
de nouveau. Si une fonction a fonctionné correctement, vous pourrez facilement le voir sur la sortie. La taille est arbitraire et peut être réglée via les deux macrosROW
etCOL
. Une dernière remarque,method_c()
s'appuie sur la longueur de la variable tableau présente depuisC99
.Déclarer simplement
De cette façon, votre
p
pointeur transmet toutes les informations nécessaires et vous pouvez extraire toutes les dimensions, sans répéternumCols
etnumRows
plus et plus.Ceci est particulièrement intéressant si vous utilisez des typedefs (que je n'aime pas d'ailleurs)
Dans ce cas, les dimensions ne sont pas visibles dans la signature de la fonction, mais la fonction aurez toujours les valeurs correctes pour les dimensions.
Vous pouvez modifier la signature de la méthode d'affichage comme suit:
Ici,
p
est un pointeur vers la ligne d'un tableau 2D. Le pointeur n'a besoin de connaître le nombre de colonnes dans le tableau.Parler, pointeur besoin de connaître la taille de chaque ligne. Ceci est très important pour l'arithmétique des pointeurs. De sorte que lorsque vous incrémenter le pointeur, le pointeur doit point à la ligne suivante.
Remarque ici,
p
n'est pas normal pointeur entier. C'est un pointeur entier à la taille de la mémoire égale àinteger_size x columns
.En main vous n'avez pas besoin de changer quoi que ce soit.
display(arr)
est tout simplement parfait.