Petit probleme de * & ** ... - C - Programmation
Marsh Posté le 19-05-2007 à 15:37:38
dans ton preleve_valeur_tampon, tu fais passer un pointeur sur une structure mon_tampon, et dans la fonction tampon_vide tu attends une structure mon_tampon
pourquoi tu utilise pas des pointeurs dans les deux cas ?
Marsh Posté le 19-05-2007 à 15:57:31
je pensais que je devait creer ces structures "modifiables" en mettant un pointeur que quand je les modifiais, quand je remplis le tampon je rentre des valeurs dans mon tableau tampon de la structure alors que quand je regarde si le tampon est vide, je ne le modifie pas. Donc je pensais pas avoir besoin d' *.
D'apres ce que tu me dis, si dans ma fonction preleve_valeur_tampon je veux utiliser un pointeur sur une structure il faut donc que ma fonction booleenne aient aussi obligatoirement ces caracteristiques ?
_Bool tampon_vide (Mon_Tampon *le_tampon)
{
return (le_tampon->dernier_element_lu==TAILLE_TAMPON) ;
}
ok. et pourquoi je peux pas appeller
remplir_tampon (&le_tampon,nomdufichier) ;
>> logiquement ca devrait marcher, non ?
Marsh Posté le 19-05-2007 à 16:25:07
non si tu passe un pointeur par référence, ça peux pas être la structure mon_tampon que tu attends...
Marsh Posté le 19-05-2007 à 17:15:34
ReplyMarsh Posté le 19-05-2007 à 17:47:10
Taz a écrit : ça n'existe pas en C |
ce n'est pas ce qu'il essai de faire ?
edit: j'ai pas dit que ça existait mais que c'est ce qu'il faisait... non ?
Marsh Posté le 19-05-2007 à 17:54:17
je comprends pas tout...
Suis pas tres doué.
qu'est ce que vous appelez "passer un pointeur par référence" ?
Marsh Posté le 19-05-2007 à 18:24:33
&variable, c'est passer variable par référence
hors variable dans ton cas est un pointeur... donc ça ne vas pas
Marsh Posté le 19-05-2007 à 18:39:23
ben... dans mon main : remplir_tampon (&my_tampon,nomdufichier); marche tres bien.
Ah, a moins que ce soit parce que dans le main j'ai déclaré:
Mon_tampon my_tampon;
Bref, il y a pas de solution alors ?
Marsh Posté le 19-05-2007 à 18:41:14
dans ton main, tu fait un "Mon_tampon tampon" ou "Mon_tampon *tampon" ?
c'est différent !
Marsh Posté le 19-05-2007 à 18:55:19
dans mon main je fait un :
Mon_Tampon tampon;
car une fois j'avais mis une étoile et je m'étais fait jeter...
Marsh Posté le 19-05-2007 à 19:01:57
ahah normal
va jeter un coup d'oeil aux pointeurs et passage de valeur par référence
Marsh Posté le 19-05-2007 à 19:09:28
"ahah normal" ?
qu'est ce qui est normal que je me sois fait jeter ou que ca marche pas ?
Marsh Posté le 19-05-2007 à 19:13:14
que ça marche pas
et que tu te fasse jeter par GCC aussi
Marsh Posté le 19-05-2007 à 19:54:55
ReplyMarsh Posté le 20-05-2007 à 00:48:50
zecrazytux a écrit : &variable, c'est passer variable par référence |
c'est absolument faux. Après tu vas me dire que joues sur les mots ... mais absolument pas. La seule sémantique du C, c'est le passage par valeur. Ne pas comprendre ça, c'est ne rien comprendre aux pointeurs.
Marsh Posté le 20-05-2007 à 13:32:53
cyber81 a écrit : bon j'abandonne... |
N'abandonne pas, je vais essayer de t'expliquer
cyber81 a écrit : J'ai créé une stucture "Mon_Tampon" :
|
ok
cyber81 a écrit : Une fonction :
|
Bon, là c'est moins bon. T'as dû apprendre qu'en C, toute fonction recevait une copie de la variable qu'on lui passe. Là, chaque fois que t'appelleras "tampon_vide", le C devra copier toute la structure dans la variable "le_tampon". Ca marche mais c'est énorme et trop lourd.
Pourquoi ne passerais-tu pas simplement l'adresse de ta structure à ta fonction, qui elle la stockerait dans un pointeur réservé à cet effet ? Une adresse ne faisant que 2 octets tu gagnes amplement en rapidité
Code :
|
Et dans le main, au lieu de faire
Code :
|
Tu fais
Code :
|
cyber81 a écrit : et une autre dont la definition est :
|
C'est en effet la principale difficulté de l'apprentissage des pointeurs. Ma fonction reçoit un pointeur mais quand je l'appelle, je ne sais pas s'il faut lui mettre "*" ou "&"
cyber81 a écrit :
|
On va raisonner
Maintenant, dans l'appelant, quelle est ma variable qui est de type "Mon_Tampon étoile" ? je n'en vois qu'une: il s'agit de "le_tampon". Donc c'est "le_tampon" que tu passes tel quel à ta fonction...
Code :
|
cyber81 a écrit : je pensais que je devait creer ces structures "modifiables" en mettant un pointeur que quand je les modifiais, quand je remplis le tampon je rentre des valeurs dans mon tableau tampon de la structure alors que quand je regarde si le tampon est vide, je ne le modifie pas. Donc je pensais pas avoir besoin d' *. |
Ce raisonnement est correct pour une variable simple. Si la fonction doit la modifier alors on lui passera un pointeur sur la variable, sinon on ne lui passera qu'une copie.
Le raisonnement reste valable pour une structure mais on tombe dans le problème du temps de copie justement. Comme ce temps peut devenir incalculable, on préfère généralement ne pas avoir à s'en préoccuper et on n'utilise que des pointeurs
cyber81 a écrit : D'apres ce que tu me dis, si dans ma fonction preleve_valeur_tampon je veux utiliser un pointeur sur une structure il faut donc que ma fonction booleenne aient aussi obligatoirement ces caracteristiques ? |
Exact
cyber81 a écrit : ok. et pourquoi je peux pas appeller |
Parce qu'il faut maintenant te placer du point de vue de l'appelant. Si l'appelant est lui-même une fonction qui n'a reçu qu'un pointeur, elle passe ce pointeur tel quel à la fonction appelée
Ex:
Code :
|
Maintenant, si l'appelant a en main la vraie variable de type "Mon_Tampon" et non-plus un simple pointeur (par exemple si l'appelant est le "main()" ), alors l'appelant doit passer un pointeur à la fonction. Donc il doit lui passer l'adresse...
Ex:
Code :
|
cyber81 a écrit : qu'est ce que vous appelez "passer un pointeur par référence" ? |
Laisse tomber. C'est une notion de C++ qui n'existe pas en C. En C, tu n'as que 2 façons de passer une variable
Marsh Posté le 19-05-2007 à 14:47:28
Salut tout le monde,
J'ai créé une stucture "Mon_Tampon" :
Une fonction :
et une autre dont la definition est :
Mon probleme c'est que je ne sais pas quoi mettre a la place des ??? dans la fonction si dessous, je pensais que c'était des adresses donc des "&" mais ca a pas l'air de marcher. Est ce du au fait que je considère des fois mon tampon comme modifiable et d autres fois non ?
merci de m'avoir lu : )