passer un tableau 2D à une fonction

gcc 4.6.2 c89

J’ai le tableau 2D suivant que je souhaite transmettre à une fonction:

char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN] = {{0}}; 

Mon prototype de fonction est:

 int get_elements(char **elements) 

Et j’appelle la fonction comme ceci:

 get_elements(elements); 

Cependant, j’obtiens l’erreur suivante:

 expected 'char **' but argument is of type 'char (*)[128]' 

Tous les tableaux se superposent en pointeurs, alors pourquoi je ne peux pas simplement passer le pointeur.

Merci beaucoup pour tout conseil,

Si l’object à transmettre à votre fonction est défini comme:

 char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN]; 

Votre prototype de fonction ne doit pas être:

 int get_elements(char **elements) 

mais plutôt:

 int get_elements(char elements[][MAX_STRING_LEN]) 

ou

 int get_elements(char (*elements)[MAX_STRING_LEN]) 

(les deux formes sont équivalentes)

La raison en est le type de la valeur d’un object de type

char [MAX_NUM_ELEMENTS][MAX_STRING_LEN]

est

char (*)[MAX_STRING_LEN] (un pointeur sur un tableau de MAX_STRING_LEN chars) et non char ** (un pointeur sur un pointeur de char ).

“Tous les tableaux se décomposent en pointeurs” est une idée fausse commune à propos de C.

Les premières réponses de cette FAQ clarifient le problème.

Vous pouvez lancer:

 get_elements((char **) elements); 

char ** et char[128][128] sont évidemment de types différents.

“Un tableau à deux dimensions et un double pointeur ne sont pas identiques” “Un tableau à deux dimensions est un tableau de pointeurs”

Est-ce que j’ai appris / mémorisé en lisant à propos de tableau et pointeur

Dites éléments – les données ont une mémoire qui commence à l’emplacement 100 .. Et les éléments du pointeur a de la mémoire à l’emplacement 50 ..

Les données d’élément obtiennent de la mémoire allouée de 100 à 100 + MAX_NUM_ELEMENTS * MAX_STRING_LEN -1 .. Et vous devez accéder aux données de 100 ..

Mais vous passez l’élément comme un double pointeur .. il tente donc d’accéder à l’emplacement (50-> 100-> Données réelles) au lieu d’accéder à l’emplacement de (50-> 100) ..

Si vous changez le prototype en int get_elements (char * element []) .. Cela fonctionnera ..

Votre prototype a l’air très cassé, il manque un nom de type.

Et vous ne pouvez pas utiliser un pointeur “décomposé”, car cela perdrait les informations sur les dimensions du tableau, qui sont (évidemment) nécessaires pour calculer correctement les access.

La meilleure façon, à mon avis, est de passer un pointeur sur le premier élément, avec les dimensions si nécessaire. Pour la 2D, cela ferait:

 int get_elements(int *elements, size_t width, size_t height); 

Cela nécessite également que vous décidiez et respectiez une disposition en mémoire pour vos éléments, telle que colonne-majeur ou ligne-majeur. Cela affecte la manière dont vous calculez l’adresse d’un élément donné.