Hello.
j'ai un pb :
je voudrai simplement passer un int tab[81][9] a une fonction de remplissage : remplir(int* t[81][9])
je l'appel de la sorte : remplir(&tab);
Et apparement c pas bon!
Pourriez vous me donner la syntaxe exact?
Merci d'avance.
Version imprimable
Hello.
j'ai un pb :
je voudrai simplement passer un int tab[81][9] a une fonction de remplissage : remplir(int* t[81][9])
je l'appel de la sorte : remplir(&tab);
Et apparement c pas bon!
Pourriez vous me donner la syntaxe exact?
Merci d'avance.
On ne peut pas le faire sous cette forme, car un tableau à 2 dimensions n'est qu'une représentation d'une zone mémoire (de 82*10 elements dans cet exemple).
Il faut donc passer l'adresse du tableau, ainsi que les 2 dimensions pour pouvoir l'utiliser dans la fonction. Quelquechose dans le genre :
Fonction : remplir(int* t,int dim1, int dim2)
Appel de la fonction : remplir(&tab,81,9);
Essaye de déclarer ta fonction comme ceci :Citation:
Envoyé par benthebest
Et tu l'appelle :Code:remplir(int t[][9])
Code:remplir(tab);
On peut aussi déclarer un tableau comme membre (unique) d'une structure et passer cette structure par référence.
Tu dis des bêtises...Citation:
Envoyé par larnicebafteur
http://emmanuel-delahaye.developpez.....htm#param_tab
http://emmanuel-delahaye.developpez.....htm#param_tabCitation:
Envoyé par benthebest
ouCode:remplir(int t[81][9])
Mais il vaut mieux aussi passer les dimensions, tu en auras probablement besoin dans la fonction :Code:remplir(int t[][9])
Appel :Code:remplir(int t[][9], size_t x, size_t y)
EDIT : suppression des * en trop. (Merci crocodilex)Code:remplir(tab, 81, 9);
Pas de 'passage par référence' en C. Par valeur uniquement. Les passages d'adresses sont explicites en C (via un opérateur & et un paramètres pointeur)Citation:
Envoyé par NicolasG
La solution que je propose est fausse alors ?:(Citation:
Envoyé par Emmanuel Delahaye
Non, c'est moi qui ais oublié de corriger... Maudit Copié/Collé...Citation:
Envoyé par crocodilex
Si on utilise ceci comment on appelle la fonction?Citation:
Envoyé par Emmanuel Delahaye
La dernière dimension (ici 9) n'a pas besoin d'être passée en paramètre puisqu'elle est imposée par le compilateur :Citation:
Envoyé par Emmanuel Delahaye
Appel :Code:remplir(int t[][9], size_t x)
Attention, la dimension supérieure n'est jamais vérifiée par le compilateur.Code:remplir(tab, 81);
Il est trompeur d'écriremême si c'est parfaitement valide.Code:remplir(int t[81][9])
La dimension 81 n'est pas validée à la compilation et on peut très bien passer un tableau de dimension inférieure ([80][9] par exemple) qui conduira à un débordement à l'exécution.
Mais ceci ne passe pas que l@de t[81][9]?Citation:
Envoyé par NicolasG
Cela passe tout le tableau?
Et pour eviter l'erreur marqué ensuite il faut faire quoi?
Un tableau est un pointeur.Citation:
Envoyé par miron
Les tableaux ne sont donc jamais copiés lors d'un passage en tant que paramètre (sauf éventuellement en tant que membre d'une structure mais c'est un autre sujet).
En C, il n'y a pas de vérification de dépassement d'indice des tableaux.
C'est au développeur de faire attention. :)
Déjà répondu. Il faut lire les messages en entiers...Citation:
Envoyé par miron
Citation:
Envoyé par NicolasG
Esce que cela est un code bon?Code:
1
2
3
4 ma_fonction(&Nom_voiture[20]) void ma_fonction(char*Nom_voiture[])
Ainsi que:
Code:
1
2
3
4 ma_fonction(&voiture_aff[15][11]) void ma_fonction(char*voiture_aff[][])
Non. Ca passe l'adresse de t[0][0].Citation:
Envoyé par miron
http://emmanuel-delahaye.developpez.....htm#param_tab
Euh, spécial comme pointeur. Il n'a pas la taille habituelle d'un pointeur et il n'est pas modifiable...Citation:
Envoyé par NicolasG
Code:
1
2
3
4
5
6
7 int a[3]; int b[3]; int *p; a = b; /* ne compile pas */ sizeof p != sizeof a
Non. C'est soit :Citation:
Envoyé par miron
soitCode:
1
2
3
4 ma_fonction(&Nom_voiture[20]) ... void ma_fonction(char *Nom_voiture)
Code:
1
2
3
4
5 char Nom_voiture[20]; ma_fonction(Nom_voiture) void ma_fonction(char*Nom_voiture)
Bon, tu arrêtes de programmer au hasard ! Tu as déjà vu [][] quelque part ? Tu n'as donc rien compris à tout ce qui a été dit précédemment, aux articles cités ?Citation:
Ainsi que:
Code:
1
2
3
4 ma_fonction(&voiture_aff[15][11]) void ma_fonction(char*voiture_aff[][])
Pose des questions si tu ne comprends pas, mais ne balance pas n'importe quoi sans réflechir...Code:
1
2
3
4
5 char voiture_aff[15][11]; ma_fonction(voiture_aff); void ma_fonction(char voiture_aff[15][11])
D'accord, une connerie de plus à mon compteur. :mrgreen:Citation:
Envoyé par Emmanuel Delahaye
Je vais tenter, et donc pour votre 2eme soit, je comprend pas pourquoion peut parler de un tableau sans les [][].Citation:
Envoyé par Emmanuel Delahaye
Si on en parle sans le compilateur comprend que l'on parle de tout le tableau?avec tous les "cases"?:oops: