Elmoricq Modérateur
| Je vais essayer de mieux expliquer, en commentant ta fonction :
Code :
- /* ces commentaires ne sont pas en phase avec la realite, concernant
- le parametre type.
- Et puis il vaut mieux ne pas melanger les commentaires utiles aux
- parametres, et ceux de variables locales. Histoire de ne pas jeter
- le trouble. */
- //mode = mode d ouverture
- //prod = identifiant fichier
- //nom = nom du fichier
- //type = nom de la structure
- //enr = structure a lu ou a copier
- void ** lire(char *nom,char *mode,size_t type,void *enr)
- {
- FILE *prod=NULL;
- size_t retour1=0;
- void **tab=NULL;
- /* pourquoi "10", surtout dans une fonction se voulant generique ? */
- int taille=10;
- prod = load(prod,nom,mode);
- /* Ici, tu alloues le tableau de pointeurs. Pourquoi pas, mais
- n'oublie pas que chaque pointeur qui sera stocke dans tab devra
- etre alloue separement.
- De plus, "type * taille" est ambigu, surtout avec 'type' de
- type size_t.
- En effet, ta variable ne contient pas de quoi identifier un
- type, mais plutot la taille d'un element unique de ton
- tableau.
- De plus, il n'est pas utile d'effectuer un cast au retour de
- malloc().
- Encore une chose : et si malloc() echoue et que tab contient
- NULL ? Beau plantage en perspective si cela arrive, tu devrais
- _toujours_ tester le retour d'une (re)allocation memoire.
- Evite egalement les commentaires en fin de ligne de code, ca
- embrouille et surcharge inutilement la ligne. Normalement, ce
- commentaire aurait du se situer juste au-dessus de la ligne.*/
- tab =(void **) malloc (type*taille);// faire une boucle de double allocation
- /* Et si dans ton fichier il y a moins de 10 elements a lire ? */
- for (int i=0;i<taille;i++)
- {
- retour1=fread(enr,type,1,prod);
- if (retour1 == 0)
- {
- /* Pour une erreur, il vaut mieux ecrire le message sur stderr.
- Tu peux pour cela utiliser "fprintf(stderr, "...)"
- De plus, ce serait pas mal de savoir pourquoi il y a eu une
- erreur.
- fread() peut en effet echouer a cause d'une vraie erreur,
- ou tout simplement parce qu'il a atteint... la fin du
- fichier !
- Voir feof() et ferror() pour l'identification de l'echec */
- printf("%s","MessageErreur(Ecriture impossible,Appuyer sur une touche pour continuer)" );
- getch();
- }
- else
- {
- /* Oui mais non. En admettant que enr ait sa propre zone
- memoire allouee (ce que j'espere vraiment), tu ne te
- contentes ici que de placer dans tab[i] l'adresse de
- enr. Qui ne change jamais dans ta boucle.
- Et a chaque fread(), le contenu precedent de enr est
- ecrase.
- Si bien qu'a la fin de ta boucle, toutes les lignes de
- tab ne contiendront que l'adresse de enr, dans lequel
- se trouvera simplement le tout dernier resultat de
- fread().
- Pour faire une copie, il faut dupliquer enr (avec
- l'allocation memoire ad hoc), et copier l'adresse
- obtenue dans tab[i]. Les free() correspondant devront
- egalement se faire sur chaque element de tab. */
- tab[i]=enr;
- }
- }
- fclose(prod);
- return(tab);
- }
|
Message édité par Elmoricq le 15-06-2005 à 13:47:23
|