# Tableau 2 dimensions en fonction



## acidjack (20 Janvier 2008)

Bonjour, je programme en C sous XCode et j'aimerai passer un tableau à 2 dimensions (sans pointeur) dans une fonction. lorsque je le fais Xcode me renvoie "error:array type has incomplete element type". Je ne sais pas d'où vient mon erreur.

Merci d'avance, voila un extrait du code:

```
void tabu(int tab[][]);

main()
{
     int tab[4][2];
     ...
     //j'appelle la fonction
     tabu(&tab[0][0]);
     ...
}

void tabu(int tab[][]) // il me met l'erreur ici
{
     ...
}
```


----------



## mpergand (20 Janvier 2008)

Il faut spécifier la taille du 1er index:


```
void tabu(int tab[][2]);

main()
{
     int tab[4][2];
     ...
     //j'appelle la fonction
     tabu(tab);
     ...
}

void tabu(int tab[][2])
{
     ...
}
```


----------



## ntx (20 Janvier 2008)

acidjack a dit:


> Bonjour, je programme en C sous XCode et j'aimerai passer un tableau à 2 dimensions (sans pointeur) dans une fonction.


D'un autre côté, le pointeur est quand même plus adapté à ce genre de manipulation. Y a-t-il quelque chose d'incontournable qui t'empêche d'utiliser un pointeur ?


----------



## tatouille (20 Janvier 2008)

ntx a dit:


> D'un autre côté, le pointeur est quand même plus adapté à ce genre de manipulation. Y a-t-il quelque chose d'incontournable qui t'empêche d'utiliser un pointeur ?


 oui son cerveau


----------



## Didier Guillion (21 Janvier 2008)

tatouille a dit:


> oui son cerveau



De toute facon s'il envoie &tab et recoit tab comme dans son exemple et non * tab, ca va pas marcher a mon avis.

Cordialement


----------



## mpergand (21 Janvier 2008)

tableau ou pointeur c'est la même chose:

int(p*)[2]=tab;
ou
int(p*)[2]=(int (*)[2])&tab[0][0];

tabu(tab);
ou
tabu((int (*)[2])&tab[0][0]);

void tabu(int tab[][2]) {}
ou
void tabu(int (*tab)[2]) {}


----------



## acidjack (28 Janvier 2008)

Je vous remercie des vos réponses, et non mon cerveau me le permet mais notre prof ne nous permet pas d'utiliser les pointeurs en cours.

Merci

Ju


----------



## boulifb (28 Janvier 2008)

Ben c'est qu'il est stupide. Les pointeurs, c'est ce qui fait la puissance et la flexibilité du C.

De manière générale, il faut si tu veux passer un tableau 2d fini en paramètre de fonction, tu peux utiliser un entête du genre:

int maFonction(int monTableau[10][10]); <-- là la taille est en dur. Le fait de mettre des crochets vides est propre au C++ et non au C (attention donc, mais le C a sûrement dû évoluer).

si tu ne connais pas la taille de ton tableau 2d et que tu ne le modifies pas:
int maFonction(int** monTableau); <-- attention: ici ton tableau peu également être un vecteur que tu peux modifier...

si tu le modifies:
int maFonction(int*** monTableau); <-- attention: ton tableau peut être un tableau à 3 dimensions que tu ne modifies pas...

et ainsi de suite.

Pour être propre avec les pointeurs, à partir du moment où tu modifies une structure ou un tableau, passe le par référence (ajoute une étoile dans l'entête). Sinon, très vite tu ne sauras plus si ça modifie ou non les valeurs, la preuve...

Cordialement.


----------



## ntx (28 Janvier 2008)

acidjack a dit:


> Je vous remercie des vos réponses, et non mon cerveau me le permet mais notre prof ne nous permet pas d'utiliser les pointeurs en cours.


Pour des questions pédagogiques ou pour masquer son ignorance ?  Parce que apprendre le passage de paramètre de type "tableau" sans utiliser les pointeurs, c'est pas vraiment du C. Donc soit vous connaissez déjà la notion de pointeur et alors ta leçon est mal faite, soit cet exercice vient trop tôt si vous n'avez pas encore aborder les pointeurs.


----------



## Didier Guillion (29 Janvier 2008)

ntx a dit:


> Pour des questions pédagogiques ou pour masquer son ignorance ?  Parce que apprendre le passage de paramètre de type "tableau" sans utiliser les pointeurs, c'est pas vraiment du C. Donc soit vous connaissez déjà la notion de pointeur et alors ta leçon est mal faite, soit cet exercice vient trop tôt si vous n'avez pas encore aborder les pointeurs.



Point.  

Balle au centre...

Cordialement


----------

