probleme de dereferencement

probleme de dereferencement - C - Programmation

Marsh Posté le 15-06-2005 à 11:43:34    

Bonjour a vous,
 
alors voila j'ai cree cette procedure :
 

Code :
  1. //mode = mode d ouverture
  2. //prod = identifiant fichier
  3. //nom  = nom du fichier
  4. //type = nom de la structure
  5. //enr  = structure a lu ou a copier
  6. void ** lire(char *nom,char *mode,size_t type,void *enr)
  7. {
  8. FILE *prod=NULL;
  9. size_t retour1=0;
  10. void **tab=NULL;
  11. int taille=10;
  12. prod= load(prod,nom,mode);
  13. tab =(void **) malloc (type*taille);// faire une boucle de double allocation
  14. for (int i=0;i<taille;i++)
  15. {
  16.  retour1=fread(enr,type,1,prod);
  17.  if (retour1==0)
  18.  {
  19.   printf("%s","MessageErreur(Ecriture impossible,Appuyer sur une touche pour continuer)" );getch();
  20.  }
  21.  else
  22.  {
  23.   tab[i]=enr;
  24.  }
  25. }
  26. fclose(prod);
  27. return(tab);
  28. }


 
 
je voulais en faire une fonction polymorphe :)  car j en ai besoin de nombreuse fois mais avec des structures differentes mais lorsque je recupere tab dans le prog appelant et que je l affiche il me met l'adresse du pointeur  :pt1cable: donc données inexploitables  je ne sais pas comment utiliser tab  :heink: pour recuperer les données merci d'avance  :ange:

Reply

Marsh Posté le 15-06-2005 à 11:43:34   

Reply

Marsh Posté le 15-06-2005 à 11:49:42    

Code :
  1. tab =(void **) malloc (type*taille);// faire une boucle de double allocation


 
Et elle est où, ta "boucle de double allocation" ?  :o  
Qui t'a mis ce commentaire ?
 
En plus le cast est inutile ici. Les noms de tes variables sont ambigus, je trouve.
 
EDIT : et puis je viens de voir que tu mets l'adresse de enr dans tab[i], mais enr ne change jamais... donc tous tes tab[i] vont pointer sur la même zone mémoire.


Message édité par Elmoricq le 15-06-2005 à 11:53:44
Reply

Marsh Posté le 15-06-2005 à 12:06:30    

Citation :

Et elle est où, ta "boucle de double allocation" ?  :o  
Qui t'a mis ce commentaire ?


 
ne pas en tenir compte c'est moi qui me le suis mis pour moi c'est rien juste une idée qu'il fallait que je note au cas ou  
 

Citation :

et puis je viens de voir que tu mets l'adresse de enr dans tab[i], mais enr ne change jamais... donc tous tes tab[i] vont pointer sur la même zone mémoire


 
ben non mon fichier est lu 10 fois j avance donc dans mon fichier a chaque tour de boucle  
 
 

Citation :

En plus le cast est inutile ici. Les noms de tes variables sont ambigus, je trouve.
 


 
pourquoi ca fait pas longtemps que je programme alors je comprends pas bien pourquoi c'est ambigu??

Reply

Marsh Posté le 15-06-2005 à 13:33:26    

Je vais essayer de mieux expliquer, en commentant ta fonction :
 

Code :
  1. /* ces commentaires ne sont pas en phase avec la realite, concernant
  2.    le parametre type.
  3.    Et puis il vaut mieux ne pas melanger les commentaires utiles aux
  4.    parametres, et ceux de variables locales. Histoire de ne pas jeter
  5.    le trouble. */
  6. //mode = mode d ouverture
  7. //prod = identifiant fichier
  8. //nom  = nom du fichier
  9. //type = nom de la structure
  10. //enr  = structure a lu ou a copier
  11. void ** lire(char *nom,char *mode,size_t type,void *enr)
  12. {
  13.    FILE *prod=NULL;
  14.    size_t retour1=0;
  15.    void **tab=NULL;
  16.    /* pourquoi "10", surtout dans une fonction se voulant generique ? */
  17.    int taille=10;
  18.    prod = load(prod,nom,mode);
  19.    /* Ici, tu alloues le tableau de pointeurs. Pourquoi pas, mais  
  20.       n'oublie pas que chaque pointeur qui sera stocke dans tab devra  
  21.       etre alloue separement.
  22.       De plus, "type * taille" est ambigu, surtout avec 'type' de  
  23.       type size_t.
  24.       En effet, ta variable ne contient pas de quoi identifier un  
  25.       type, mais plutot la taille d'un element unique de ton  
  26.       tableau.  
  27.       De plus, il n'est pas utile d'effectuer un cast au retour de
  28.       malloc().
  29.       Encore une chose : et si malloc() echoue et que tab contient
  30.       NULL ? Beau plantage en perspective si cela arrive, tu devrais
  31.       _toujours_ tester le retour d'une (re)allocation memoire.
  32.       Evite egalement les commentaires en fin de ligne de code, ca
  33.       embrouille et surcharge inutilement la ligne. Normalement, ce
  34.       commentaire aurait du se situer juste au-dessus de la ligne.*/
  35.    tab =(void **) malloc (type*taille);// faire une boucle de double allocation
  36.    /* Et si dans ton fichier il y a moins de 10 elements a lire ? */
  37.    for (int i=0;i<taille;i++)
  38.    {
  39.       retour1=fread(enr,type,1,prod);
  40.       if (retour1 == 0)
  41.       {
  42.          /* Pour une erreur, il vaut mieux ecrire le message sur stderr.
  43.             Tu peux pour cela utiliser "fprintf(stderr, "...)"
  44.             De plus, ce serait pas mal de savoir pourquoi il y a eu une
  45.             erreur.
  46.             fread() peut en effet echouer a cause d'une vraie erreur,  
  47.             ou tout simplement parce qu'il a atteint... la fin du  
  48.             fichier !
  49.             Voir feof() et ferror() pour l'identification de l'echec */
  50.          printf("%s","MessageErreur(Ecriture impossible,Appuyer sur une touche pour continuer)" );
  51.          getch();
  52.       }
  53.       else
  54.       {
  55.          /* Oui mais non. En admettant que enr ait sa propre zone  
  56.             memoire allouee (ce que j'espere vraiment), tu ne te  
  57.             contentes ici que de placer dans tab[i] l'adresse de  
  58.             enr. Qui ne change jamais dans ta boucle.  
  59.             Et a chaque fread(), le contenu precedent de enr est  
  60.             ecrase.
  61.             Si bien qu'a la fin de ta boucle, toutes les lignes de  
  62.             tab ne contiendront que l'adresse de enr, dans lequel  
  63.             se trouvera simplement le tout dernier resultat de  
  64.             fread().
  65.             Pour faire une copie, il faut dupliquer enr (avec  
  66.             l'allocation memoire ad hoc), et copier l'adresse
  67.             obtenue dans tab[i]. Les free() correspondant devront
  68.             egalement se faire sur chaque element de tab. */
  69.          tab[i]=enr;
  70.       }
  71.    }
  72.    fclose(prod);
  73.    return(tab);
  74. }


Message édité par Elmoricq le 15-06-2005 à 13:47:23
Reply

Marsh Posté le 15-06-2005 à 14:23:10    

Merci pour tes conseils sage qui m'ont bien eclairé je suis finalement arrivé a mes fins grace a tes conseils  
 

Reply

Sujets relatifs:

Leave a Replay

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