Passer l'adresse d'un tableau a 2 dim en parametre [OK] [c] - C - Programmation
Marsh Posté le 26-04-2004 à 15:52:31
Un programme en C, c'est comme un ciel d'été : c'est plein d'étoiles
Marsh Posté le 26-04-2004 à 15:59:30
c sympa, mais ça m'aide pas beaucoup
J'ai mis trop d'étoiles dans mon ciel ?? heu, dans mon programme ??
Marsh Posté le 26-04-2004 à 16:18:57
Gros Doute :
si je fait
Code :
|
avec une fonction
Code :
|
ça me passe une copie tu tableau ou bien l'adresse du 1er élément du tableau ???
Marsh Posté le 26-04-2004 à 16:43:33
J'ai trouvé une solution en faisant :
Code :
|
et
Code :
|
Mais dans ma fonction, je ne peux plus faire
Code :
|
gcc me sort à la compilation : subscripted value is neither array nor pointer
je ne comprend plus ...
Le passage du tableau en parametre est-il bon ???
Merci.
Marsh Posté le 26-04-2004 à 17:15:02
void Fonction (int* Vector)
...
Fonction(Vector)
?
Marsh Posté le 26-04-2004 à 17:21:46
non désolé ce n'est pas ça, le compilateur me dit toujours passing arg 1 of `Fonction' from incompatible pointer type
Merci quand meme
Marsh Posté le 26-04-2004 à 17:46:44
Lors du passage en paramètre d'un tableau à 2 dimensions le compilateur perd la taille de la dimension 2, qui est pourtant indispensable pour indexer correctement le tableau (car un tableau à deux dimensions, en mémoire, est "tout plat" ). Donc il y a plusieures manières de faire, par exemple :
Code :
|
Marsh Posté le 26-04-2004 à 17:54:11
Allez, soyons fou, je rajouterais même foo4 :
Code :
|
Ce qui permet, une fois à l'intérieur de la fonction, de connaître le nombre de lignes (l) et le nombre de colonnes (c).
Bon ce coup-ci c'est tout propre !
Marsh Posté le 26-04-2004 à 18:37:32
pour les dimensions, utilisez le type prévu pour : size_t
Marsh Posté le 26-04-2004 à 23:05:48
Pour passer un tableau 2D suffit de faire :
Code :
|
puis
Code :
|
Marsh Posté le 26-04-2004 à 23:10:49
kmikaz92 a écrit :
|
Hum c'est déjà syntaxiquement faux...
Je crois que toutes les solutions "raisonnables" ont été données plus haut (si ce n'est qu'il aurait été en effet mieux d'utiliser size_t).
Marsh Posté le 26-04-2004 à 23:29:35
Oops me croyait en PHP en fait Et encore je sais pas si ca marche en PHP mais je me souviens l'avoir fait...
Pour le size_t, c'est juste un typedef de unsigned... je pense pas que ca fasse bugger le programme. Mais il est mieux de l'utiliser oui.
Marsh Posté le 27-04-2004 à 09:16:30
plutôt que d'essayer de rajouter une * par là, ajouter un & par là, vaudrait mieux relire le chapitre sur les pointeurs
Marsh Posté le 27-04-2004 à 10:01:14
Alors j'ai testé un peu toute les solutions, elles marchent bien.
Mais pour mon second probleme qui était d'assigner l'adresse d'une case du tableau a une variable :
Code :
|
j'avais une erreur de compilation.
J'ai réussi a contrer le problème en fesant :
Code :
|
et ça marche très bien.
Merci à tous
Marsh Posté le 27-04-2004 à 10:43:57
oui, ça te parait peut-etre stupide. Et c'est surement pour ça que ça ne marchait pas
Marsh Posté le 27-04-2004 à 11:52:00
HelloWorld a écrit :
? |
et il les connait comment les dimensions ton compilateurs ?
Marsh Posté le 27-04-2004 à 14:30:52
Citation : Mais pour mon second probleme qui était d'assigner l'adresse d'une case du tableau a une variable : |
Marsh Posté le 27-04-2004 à 14:50:21
HelloWorld a écrit :
|
ça m'étonne pas...
Marsh Posté le 27-04-2004 à 16:28:14
HelloWorld a écrit : non non, regarde, j'ai rajouté un "&" |
Meme avec un '&' le compilateur ne voulait rien savoir, j'avais la même erreur
Marsh Posté le 28-04-2004 à 14:29:07
Ba deja ya les dimensions qu'il faut indiquer.
Mais aussi, il faut delcarer un ptr de ptr non ?
int** ptr ; et non int* ptr ;
enfin je crois... ca fait lgt que j'ai pas fait de C.
Marsh Posté le 28-04-2004 à 16:03:28
Faudrait pas tout mélanger quand même. Le code de HelloWorld est parfaitement correct, ou alors je n'ai pas compris la question initiale.
Code :
|
Si tu parlais de passage de paramètres, des exemples ont été donnés plus haut.
Marsh Posté le 28-04-2004 à 17:55:23
Non, le passage de paramètre est bon, c'est dans ma fonction que j'avais un problème
Code :
|
Cette derniere instruction ne passais pas au compilateur.
par contre celle la marche :
Code :
|
Et je n'ai plus d'erreur de compilation.
Mais je vois toujours pas pourquoi ptr = &tab[i][j]; ne marchais pas.
Marsh Posté le 28-04-2004 à 18:21:31
fif_x a écrit :
|
i et j sont des variables globales ?
Marsh Posté le 29-04-2004 à 00:42:17
fif_x a écrit : Non, le passage de paramètre est bon, c'est dans ma fonction que j'avais un problème
|
Ce n'est pas l'affectation qui est en cause, c'est simplement que tab[i][j] ne veut rien dire, car tab n'est pas un tableau à deux dimensions ! Peut importe qu'il soit un pointeur sur le premier élément d'un tel tableau, l'information est perdue lors du passage de paramètre, dans la procédure c'est un "simple" pointeur sur un int.
tab[i] est totalement équivalent à *(tab + i). En l'occurrence, cette expression est de type int. tab[i][j] est donc une tentative d'indexer une expression de type int, ce qui est illégal.
La seule solution est donc de passer explicitement la dimension de la seconde dimension en paramètre et de faire comme tu l'as fait:
Code :
|
Marsh Posté le 29-04-2004 à 11:43:02
Merci beaucoup de ta réponse, c'est très clair maintenant
Marsh Posté le 10-05-2004 à 16:22:38
Bonjour,
un autre petit problème me tracasse serieusement,
J'ai un fonction du style
Code :
|
Mon main :
Code :
|
gcc me dit :
AVERTISSEMENT: passage de arg 1 de « fonction » d'un type pointeur incompatible
Je n'arrive pas à passer Names en paramètre de la fonction, je ne trouve pas le bon format
Marsh Posté le 10-05-2004 à 16:32:40
Ce serais déjà une bonne chose de vérifier que tes allocations mémoire se déroulent sans problème.
Code :
|
Tu as un tableau dont la longueur des chaines de caractères est fixe pourquoi "s'embêter" avec une deuxième dimension.
Code :
|
Avec la fonction calloc tu auras déjà initialisé toutes tes chaines à "".
Pour accèder à la chaine N :
Code :
|
Il faut faire attention à la longueur des chaines que tu copies, par exemple en utilisant strncpy.
Pour N entre 0 et nb-1.
MAXCARINNAME doit être égal au nombre maximal de caractère plus un (pour le fameux '\0').
Enfin le prototype de la fonction fonction devient :
Code :
|
En espérant ne pas avoir dit trop de conneries.
Marsh Posté le 10-05-2004 à 16:47:45
Sans parler de la façon d'utiliser malloc, il est logique que le compilo gueule. Names est un char**. Après initialisation, il pointera ici sur le premier élément d'un tableau de char*, et chacun de ces char* pointera sur le premier élément d'un tableau de char (après initialisation dans la boucle). Ce n'est PAS la même chose qu'un tableau à deux dimensions, même si la syntaxe utilisée pour accéder aux éléments est la même.
De façon imagée, le tableau à 2 dimensions est "tout plat" en mémoire. Les éléments sont rangés les uns à côtés des autres, la vision des deux dimensions est purement logique mais tu pourrais tout aussi bien le voir comme un tableau à une seule dimension; c'est simplement de l'arithmétique sur les pointeurs.
Par contre dans la version utilisant malloc que tu as décrit, tu construis un tableau de pointeurs qui pointent chacun sur des tableaux. Cela ressemble à un tableau à 2 dimension mais cela n'en est pas un, les éléments ne sont pas contigus en mémoire et tu as une étape d'indirection supplémentaire.
Donc dans le cas présent, ta fonction doit donc simplement recevoir un char** en argument.
En gros dans le début de ce fil, tu tentais d'enfiler un tableau à 2 dimensions dans un char** et maintenant tu tentes d'enfiler un char** dans un tableau à 2 dimensions.....
Marsh Posté le 10-05-2004 à 16:51:55
tu fait prof de C djdie ?
Tu explique beaucoup mieux que mes anciens profs
Marsh Posté le 10-05-2004 à 17:08:00
Donc il faudrai que je passe à ma fonction un tableau a 2 dimensions "plats" (si j'ai bien compris).
Mais si je fait comme a proposé darkoli :
Code :
|
A l'exectution, j'ai un seg fault.
Marsh Posté le 10-05-2004 à 17:11:25
Si tu veux utiliser ta fonction telle quelle tu dois déclarer un vrai tableau à deux dimensions :
Code :
|
Marsh Posté le 10-05-2004 à 17:16:46
Merci, mais le problème étant que je ne connais pas à l'avance la taille du tableau.
Donc je doit modifier le prototype de ma fonction.
L'autre problème c'est que dans mon programme, soit j'appelle ma fonction avec un Vrai tableau a 2 dimensions, soit je l'appelle avec un tableau a 2 dimensions alloué dynamiquement.
Est-ce possible de faire un prototype de fonction qui accepte les 2 types ???
Marsh Posté le 10-05-2004 à 20:27:49
Un truc pas mal que j'ai eu en cours ce matin:
Code :
|
Si vous pensez qu'il y a une erreur dans le typedef, lisez votre "kernighan et Ritchie"!
Marsh Posté le 10-05-2004 à 20:31:13
je vois juste que sur un système 32bits, ton tableau fait 40ko et n'est évidemment pas souple du tout
Marsh Posté le 10-05-2004 à 21:27:02
fif_x a écrit : Donc il faudrai que je passe à ma fonction un tableau a 2 dimensions "plats" (si j'ai bien compris).
|
J'ai copié/collé ton code et j'ai oublié d'enlever une étoile !
Code :
|
Marsh Posté le 26-04-2004 à 15:42:16
Bonjour,
j'essaye de passer l'adresse d'un tableau à 2 dimensions en paramètre de ma fonction mais je n'y arrive point.
dans mon main, j'ai une variable :
j'appelle ma fonction ainsi :
et ma fonction est déclarée comme suit :
A la compilation, j'ai cette erreur là :
orion > gcc -o label SpectralRouting.c
SpectralRouting.c: In function `main':
SpectralRouting.c:62: warning: passing arg 1 of `Fonction' from incompatible pointer type
Donc je ne comprend pas d'où vient mon erreur ...
Pourtant en c, l'adresse d'un tableau d'entiers à 2 dimensions, c'est bien un int *** non ????
Merci des réponses
Message édité par fif_x le 27-04-2004 à 10:44:54