Passage d’un tableau 2D de pointeurs en C

Pour mon programme, je dois passer un tableau 2D de pointeurs à une fonction dans un fichier séparé. J’ai écrit un fichier de syntaxe similaire ci-dessous:

#include  #include  typedef struct { int state; int design; } card_t; card_t *cardSet[5][5]; void setFirst(card_t *cards[][]) { // state = 1; } int main() { setFirst(cardSet); // <- Error: Type of formal parameter 1 is incomplete return 0; } 

Lorsque je modifie le code pour tous les tableaux 1D, la compilation est bonne, mais pour un tableau 2D, les erreurs ci-dessus sont générées. Quelle est la différence entre les deux cas?

Merci! Cameron

si vous passez un tableau à une fonction, vous devez spécifier la taille du tableau intérieur, dans votre cas, au lieu de void setFirst(card_t *cards[][]) , vous devez spécifier void setFirst(card_t *cards[][5]) .

Pourquoi avez-vous besoin de l’indiquer et non de la taille de la première dimension?

Comme les cartes sont un tableau de pointeurs card_t, si vous voulez accéder aux cartes [1] [0], le compilateur devra savoir combien append aux cards pointeur – les cartes sont déclarées: card_t *cards[5][4] il faudra append 4 * sizeof(*card_t) pour accéder aux cartes [1] [0], mais si des cartes sont déclarées: card_t *cards[5][5] il faudra append 5 * sizeof(*card_t) pour accéder aux cartes [1] [0].

Comme cela a été mentionné, pour passer un tableau 2D à une fonction, vous devez avoir toutes les dimensions sauf la première déclarée. Cependant, vous pouvez également simplement passer le pointeur, comme suit. Notez que vous devez toujours (à moins que la dimension du tableau soit complètement fixée et que la fonction qui agit sur le tableau ne fonctionne que dans la dimension du tableau), la longueur de chaque tableau aussi.

 void setFirst(card_t ***cards, size_t n, size_t m) { if (n > 0 && m > 0) { cards[0][0]->state = 1; } } 

Parce que référencer un tableau via le code[0][0] est identique à *(*(code+0)+0*m) , vous pouvez passer deux pointeurs au lieu des dimensions de tableau.

Seul le premier index est facultatif. Vous devez absolument mentionner le deuxième index, car un tableau à deux dimensions se décompose en un pointeur sur un tableau à 1d.

 void setFirst(card_t *cards[][5]) { // ^ Newly added // .. } 

Assurez-vous également que les pointeurs pointent vers des emplacements de mémoire valides. Sinon, le déréférencement conduit à des erreurs de segmentation. BTW, y at-il une raison d’avoir un tableau à deux dimensions avec des pointeurs. Je pense que vous ne faites que compliquer le programme.

Pour obtenir quelque chose de similaire à ce que vous essayez C99 a des tableaux de longueur variable. Celles-ci sont particulièrement utiles dans les définitions de fonctions:

 void setFirst(size_t n, size_t m, card_t *cards[n][m]) { ... } 

Observez que vous devez connaître les parameters de taille au moment de la déclaration de tableau, il vous faudra donc les mettre au premier plan.