Petit probleme de * & ** ...

Petit probleme de * & ** ... - C - Programmation

Marsh Posté le 19-05-2007 à 14:47:28    

Salut tout le monde,
 
 
J'ai créé une stucture "Mon_Tampon" :
 

Code :
  1. typedef struct
  2.     {
  3.             int tampon[TAILLE_TAMPON];
  4.             int dernier_element_lu;
  5.     } Mon_Tampon;


 
Une fonction :

Code :
  1. _Bool tampon_vide (Mon_Tampon le_tampon)
  2.     {
  3.         return  (le_tampon.dernier_element_lu==TAILLE_TAMPON);
  4.     }


 
et une autre dont la definition est :

Code :
  1. void remplir_tampon (Mon_Tampon *le_tampon,char* nomdufichier)


 
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 ?
 

Code :
  1. int preleve_valeur_tampon (Mon_Tampon * le_tampon,char* nomdufichier)
  2.     {
  3.         int res;
  4.        if (tampon_vide ( ???le_tampon))
  5.             {
  6.                 remplir_tampon (???le_tampon,nomdufichier);
  7. .... // le reste a pas d'importance
  8.     }


 
merci de m'avoir lu : )

Reply

Marsh Posté le 19-05-2007 à 14:47:28   

Reply

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  ?


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

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 ?

Reply

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...


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 19-05-2007 à 17:15:34    

zecrazytux a écrit :

non si tu passe un pointeur par référence.


ça n'existe pas en C

Reply

Marsh 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 ?    


Message édité par zecrazytux le 19-05-2007 à 17:47:52

---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

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" ?

Reply

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


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

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 ?


Message édité par cyber81 le 19-05-2007 à 18:40:58
Reply

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 !


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 19-05-2007 à 18:41:14   

Reply

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...

Reply

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


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

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 ?

Reply

Marsh Posté le 19-05-2007 à 19:13:14    

que ça marche pas

 

et que tu te fasse jeter par GCC aussi    

 


Message édité par zecrazytux le 19-05-2007 à 19:13:32

---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 19-05-2007 à 19:54:55    

bon j'abandonne...
merci quand meme
bye

Reply

Marsh Posté le 20-05-2007 à 00:48:50    

zecrazytux a écrit :

&variable, c'est passer variable par référence
 
hors variable dans ton cas est un pointeur... donc ça ne vas pas


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.

Reply

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" :
 

Code :
  1. typedef struct
  2.     {
  3.             int tampon[TAILLE_TAMPON];
  4.             int dernier_element_lu;
  5.     } Mon_Tampon;



ok
 

cyber81 a écrit :

Une fonction :

Code :
  1. _Bool tampon_vide (Mon_Tampon le_tampon)
  2.     {
  3.         return  (le_tampon.dernier_element_lu==TAILLE_TAMPON);
  4.     }



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 :
  1. _Bool tampon_vide (Mon_Tampon *le_tampon)
  2.     {
  3.         return  (le_tampon->dernier_element_lu==TAILLE_TAMPON);
  4.     }


 
Et dans le main, au lieu de faire

Code :
  1. int main(void)
  2.     {
  3.         Mon_Tampon Tampon;
  4.         if (tampon_vide(Tampon))                   // Je passe Tampon à la fonction
  5.              ...
  6. }


 
Tu fais

Code :
  1. int main(void)
  2.     {
  3.         Mon_Tampon Tampon;
  4.         if (tampon_vide(&Tampon))                // Je passe l'adresse de Tampon à la fonction
  5.              ...
  6. }


 

cyber81 a écrit :

et une autre dont la definition est :

Code :
  1. void remplir_tampon (Mon_Tampon *le_tampon,char* nomdufichier)


 
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 ?


 
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 :

Code :
  1. int preleve_valeur_tampon (Mon_Tampon * le_tampon,char* nomdufichier)
  2.     {
  3.         int res;
  4.        if (tampon_vide ( ???le_tampon))
  5.             {
  6.                 remplir_tampon (???le_tampon,nomdufichier);
  7. .... // le reste a pas d'importance
  8.     }



On va raisonner

  • ta fonction reçoit une variable de type "Mon_Tampon étoile" (t'as remarqué, j'ai écrit le mot "étoile" car il est important, il faut partie intégrante du type). C'est donc une adresse sur un type "Mon_tampon"

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 :
  1. int preleve_valeur_tampon (Mon_Tampon * le_tampon,char* nomdufichier)
  2.     {
  3.         int res;
  4.        if (tampon_vide (le_tampon))
  5.        {
  6.              remplir_tampon (le_tampon, nomdufichier);
  7.              ....
  8.         }
  9. }


 

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 ?
 
_Bool tampon_vide (Mon_Tampon *le_tampon)    
      {        
           return  (le_tampon->dernier_element_lu==TAILLE_TAMPON) ;    
      }


Exact
 

cyber81 a écrit :

ok. et pourquoi je peux pas appeller
remplir_tampon (&le_tampon,nomdufichier) ;
>> logiquement ca devrait marcher, non ?


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 :
  1. fonctionX(Mon_Tampon *pointeur)
  2. {
  3.     remplir_tampon(pointeur);
  4. }


 
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 :
  1. int main(void)
  2. {
  3.     Mon_Tampon Tampon;
  4.     remplir_tampon(&Tampon);
  5. }


 

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

  • par copie
  • par adresse


Message édité par Sve@r le 20-05-2007 à 13:49:23

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed