Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1908 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Petit probleme de * & ** ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petit probleme de * & ** ...

n°1562368
cyber81
Posté le 19-05-2007 à 14:47:28  profilanswer
 

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

mood
Publicité
Posté le 19-05-2007 à 14:47:28  profilanswer
 

n°1562377
zecrazytux
Posté le 19-05-2007 à 15:37:38  profilanswer
 

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
n°1562386
cyber81
Posté le 19-05-2007 à 15:57:31  profilanswer
 

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 ?

n°1562398
zecrazytux
Posté le 19-05-2007 à 16:25:07  profilanswer
 

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
n°1562407
Taz
bisounours-codeur
Posté le 19-05-2007 à 17:15:34  profilanswer
 

zecrazytux a écrit :

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


ça n'existe pas en C

n°1562412
zecrazytux
Posté le 19-05-2007 à 17:47:10  profilanswer
 

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
n°1562415
cyber81
Posté le 19-05-2007 à 17:54:17  profilanswer
 

je comprends pas tout...
Suis pas tres doué.
 
qu'est ce que vous appelez "passer un pointeur par référence" ?

n°1562421
zecrazytux
Posté le 19-05-2007 à 18:24:33  profilanswer
 

&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
n°1562423
cyber81
Posté le 19-05-2007 à 18:39:23  profilanswer
 

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
n°1562424
zecrazytux
Posté le 19-05-2007 à 18:41:14  profilanswer
 

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
mood
Publicité
Posté le 19-05-2007 à 18:41:14  profilanswer
 

n°1562426
cyber81
Posté le 19-05-2007 à 18:55:19  profilanswer
 

dans mon main je fait un :
Mon_Tampon tampon;
 
car une fois j'avais mis une étoile et je m'étais fait jeter...

n°1562429
zecrazytux
Posté le 19-05-2007 à 19:01:57  profilanswer
 

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
n°1562434
cyber81
Posté le 19-05-2007 à 19:09:28  profilanswer
 

"ahah normal" ?
qu'est ce qui est normal que je me sois fait jeter ou que ca marche pas ?

n°1562438
zecrazytux
Posté le 19-05-2007 à 19:13:14  profilanswer
 

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
n°1562452
cyber81
Posté le 19-05-2007 à 19:54:55  profilanswer
 

bon j'abandonne...
merci quand meme
bye

n°1562531
Taz
bisounours-codeur
Posté le 20-05-2007 à 00:48:50  profilanswer
 

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.

n°1562604
Sve@r
Posté le 20-05-2007 à 13:32:53  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Petit probleme de * & ** ...

 

Sujets relatifs
probléme compabilité entre ie et firefoxProbleme de gotoAndStop(scene,1);
Problème avec DOCTYPE html PUBLICPetit programme en VBA... besoin d´aide
[Résolu] Problème polymorphisme et sous typageProblème de couleur sous IE
Problème d'authentification pour accès à une base SQLLabview: problème pour créer un tableau
Problème CSS dynamiqueProblème d'envoi de mail avec pièce jointe
Plus de sujets relatifs à : Petit probleme de * & ** ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR