Probleme de free sur une structure

Probleme de free sur une structure - C - Programmation

Marsh Posté le 18-04-2006 à 12:39:10    

Bonjour tout le monde.
 
Je débute en C, et je n'arrive pas à me servir de la fonction free. j'en appel donc a votre aide.
Pour le bien d'un programme j'ai définie une belle structure "Sac" qui se présente sous la forme d'un pile qui contient des tableau qui contiennent des files de caractère.
hors je n'arrive pas a libérer la mémoire de cette structure codé comme ceci:

Code :
  1. /*Definition d une Pile */
  2. struct sac {
  3.   SP x;
  4.   struct sac * suiv;
  5. };
  6. /*Creation d une pile*/
  7. Sac creer(){
  8.   return NULL;
  9. }
  10. /*affichage d une erreur*/
  11. void error(char * err){
  12.   fprintf(stderr,"erreur:la pile est vide (%s)",err);
  13. }
  14. /*Ajouter un element*/
  15. Sac  empiler(SP s, Sac p){
  16.      Sac P1= (Sac) malloc(sizeof(struct sac));
  17.      P1->x=s;
  18.      P1->suiv=p;
  19.      return P1;
  20.      }
  21.    
  22. /*depiler la pile*/
  23. Sac depiler(Sac p){
  24.     Sac p1;
  25.   if (vide(p))
  26.     error("depiler" );
  27.     p1=p->suiv;
  28.     free(p);   
  29.   return p1;
  30.      }
  31. /*indique si la pile est vide*/
  32. int vide(Sac p){
  33.   return p==NULL;
  34. }
  35. /*Sommet de la pile*/
  36. SP sommet(Sac p){
  37.   if (vide(p))
  38.     error("sommet" );
  39.   return p->x;
  40. }


 
j'ai fait le test suivant:

Code :
  1. File F=creerF();
  2.       SP sp=creerSP();
  3.       Sac S=creer();
  4.       int i;
  5.       F=enfile("3",F);
  6.       ajouter(F,sp);
  7.       for(i=0;i<10000000;i++)
  8.       S=empiler(sp,S);
  9.       printf("intermediaire\n" );
  10.       for(i=0;i<999998;i++)
  11.       S=depiler(S);
  12.       printf("fin\n" );
  13.       scanf("%s" );


 
SP un tableau, et File, une file de caractère.
dans ce test quand je regarde la charge mémoire dédier, elle arrive a 430mo avant "intermédiaire" ( 270 au départ )
elle redéssend a 411 avant le scanf
elle redessend a 270 avec un controle-C
 
Je ne comprend pas trop comment libérer tout cet espace perdu :/
 
Merci d'avance pour votre aide

Message cité 1 fois
Message édité par Makapouf le 18-04-2006 à 14:22:03

---------------
La raison est la mesure de toutes choses!   Venez découvrir de la peinture pointilliste
Reply

Marsh Posté le 18-04-2006 à 12:39:10   

Reply

Marsh Posté le 18-04-2006 à 14:12:15    

Makapouf a écrit :

hors je n'arrive pas a libérer la mémoire de cette structure codé comme ceci:



Project   : Forums
Compiler  : GNU GCC Compiler (called directly)
Directory : D:\dev\ed02\cb\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c:4: error: syntax error before "SP"
main.c:4: warning: no semicolon at end of struct or union
main.c:6: error: syntax error before '}' token
main.c:10: error: syntax error before "creer"
main.c:10: warning: return type defaults to `int'
main.c:10: warning: function declaration isn't a prototype
main.c: In function `creer':
main.c:11: error: `NULL' undeclared (first use in this function)
main.c:11: error: (Each undeclared identifier is reported only once
main.c:11: error: for each function it appears in.)
main.c: At top level:
main.c:16: warning: no previous prototype for 'error'
main.c: In function `error':
main.c:17: error: implicit declaration of function `fprintf'
main.c:17: warning: nested extern declaration of `fprintf'
<internal>:0: warning: redundant redeclaration of 'fprintf'
main.c:17: error: `stderr' undeclared (first use in this function)
main.c: At top level:
main.c:22: error: syntax error before "empiler"
main.c:22: error: syntax error before "s"
main.c:22: warning: return type defaults to `int'
main.c:22: warning: function declaration isn't a prototype
main.c: In function `empiler':
main.c:23: error: `Sac' undeclared (first use in this function)
main.c:23: error: syntax error before "P1"
main.c:24: error: `P1' undeclared (first use in this function)
main.c:24: error: `s' undeclared (first use in this function)
main.c:25: error: `p' undeclared (first use in this function)
main.c: At top level:
main.c:31: error: syntax error before "depiler"
main.c:31: error: syntax error before "p"
main.c:31: warning: return type defaults to `int'
main.c:31: warning: function declaration isn't a prototype
main.c: In function `depiler':
main.c:32: error: `Sac' undeclared (first use in this function)
main.c:32: error: syntax error before "p1"
main.c:33: error: implicit declaration of function `vide'
main.c:33: warning: nested extern declaration of `vide'
main.c:33: error: `p' undeclared (first use in this function)
main.c:34: warning: passing arg 1 of `error' discards qualifiers from pointer target type
main.c:35: error: `p1' undeclared (first use in this function)
main.c:36: error: implicit declaration of function `free'
main.c:36: warning: nested extern declaration of `free'
main.c: At top level:
main.c:42: error: syntax error before "p"
main.c:42: warning: function declaration isn't a prototype
main.c: In function `vide':
main.c:43: error: `p' undeclared (first use in this function)
main.c:43: error: `NULL' undeclared (first use in this function)
main.c: At top level:
main.c:48: error: syntax error before "sommet"
main.c:48: error: syntax error before "p"
main.c:48: warning: return type defaults to `int'
main.c:48: warning: function declaration isn't a prototype
main.c: In function `sommet':
main.c:49: error: `p' undeclared (first use in this function)
main.c:50: warning: passing arg 1 of `error' discards qualifiers from pointer target type
main.c: At top level:
main.c:52: error: syntax error before '[' token
main.c:57: warning: type defaults to `int' in declaration of `sp'
main.c:57: error: implicit declaration of function `creerSP'
main.c:57: error: initializer element is not constant
main.c:57: warning: data definition has no type or storage class
main.c:58: error: syntax error before "S"
main.c:58: warning: type defaults to `int' in declaration of `S'
main.c:58: error: initializer element is not constant
main.c:58: warning: data definition has no type or storage class
main.c:60: warning: type defaults to `int' in declaration of `F'
main.c:60: error: implicit declaration of function `enfile'
main.c:60: error: initializer element is not constant
main.c:60: warning: data definition has no type or storage class
main.c:61: warning: type defaults to `int' in declaration of `ajouter'
main.c:61: warning: parameter names (without types) in function declaration
main.c:61: warning: data definition has no type or storage class
main.c:62: error: syntax error before "for"
main.c:64: error: syntax error before string constant
main.c:64: warning: type defaults to `int' in declaration of `printf'
main.c:64: warning: function declaration isn't a prototype
main.c:64: warning: conflicting types for built-in function 'printf'
main.c:64: warning: data definition has no type or storage class
main.c:67: error: syntax error before string constant
main.c:67: warning: type defaults to `int' in declaration of `printf'
main.c:67: warning: function declaration isn't a prototype
main.c:67: warning: redundant redeclaration of 'printf'
main.c:64: warning: previous declaration of 'printf' was here
main.c:67: warning: data definition has no type or storage class
main.c:68: error: syntax error before string constant
main.c:68: warning: type defaults to `int' in declaration of `scanf'
main.c:68: warning: function declaration isn't a prototype
main.c:68: warning: conflicting types for built-in function 'scanf'
main.c:68: warning: data definition has no type or storage class
Process terminated with status 1 (0 minutes, 1 seconds)
40 errors, 39 warnings


Merci de poster du code qui compile...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 14:20:27    

OK, mais ça va faire beaucoup de code.
 
je met directement le lien des fichier h et c car sinon ça va devenir imcompréhensible:
 
http://makapouf.free.fr/SP.c
http://makapouf.free.fr/SP.h
http://makapouf.free.fr/Sac.c
http://makapouf.free.fr/Sac.h
http://makapouf.free.fr/file.c
http://makapouf.free.fr/file.h
http://makapouf.free.fr/test.c
 
le test contien le main
Merci a ceux qui aurons le courage de lire ça, surtout qe j'ai du faire des erreurs grossiere, mais faut pas trop m'en vouloir je débute
 


---------------
La raison est la mesure de toutes choses!   Venez découvrir de la peinture pointilliste
Reply

Marsh Posté le 18-04-2006 à 15:08:16    

Makapouf a écrit :

OK, mais ça va faire beaucoup de code.


Apprendre à réduire au strict minimum compilabkle montrant le problème fait artie du métier. Mais là, effectivement, il s'agit peut être d'un problème d'intégration... Ceci dit, est-ce que chaque objet a été testé individuellement ?  
 
Je travaille sur des projets de 100 000 à 10 000 000 de lignes. Crois-tu qu'on teste tout d'un coup ? Non. Le code est un assemblage de modules parfaitement autonomes et sévèrement testés individuellements (Tests Unitaires).  
 
Quand il y a un bug quelque part, on sait déjà que ça ne peut pas venir du code validé. On s'appuye sur du solide. Si les fondations et les briques sont fragile, l'ensemble s'effondre. C'est logique...
 
Apprendre à gérer de gros projets, ça fait aussi partie du métier...
 
A vue de nez, les modules SP, Sac et file devraient faire l'objet de testst unitaires. Est-ce le cas ? Si oui, ils sont peut être trop laxistes ? Il ne fait pas hésiter à violenter son code. Il n'ira pas se plaindre, on peut en profiter à l'extrême ! (Et en plus ça défoule...)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 15:47:53    

Tout marche en fait, tout a été testé individuellement avant de faire partie d'un programme qui est encore plus grand que ce que j'ai poster ici.
Au début je en pensais pas que j'aurais besoin de faire des free(). Car j'imaginais pas que le programme final prendrait tant de ressource.
 
Mais au vue du programme final ( qui marche au passage) , j'ai décidé de paufiner mes structure et de libérer la mémoire quand je le pouvais.
Mais visiblement je m'y prend mal.

Message cité 2 fois
Message édité par Makapouf le 18-04-2006 à 15:48:29

---------------
La raison est la mesure de toutes choses!   Venez découvrir de la peinture pointilliste
Reply

Marsh Posté le 18-04-2006 à 15:55:35    

Makapouf a écrit :

Tout marche en fait, tout a été testé individuellement avant de faire partie d'un programme qui est encore plus grand que ce que j'ai poster ici.
Au début je en pensais pas que j'aurais besoin de faire des free(). Car j'imaginais pas que le programme final prendrait tant de ressource.


Faut toujours libérer ce qui a été alloué.
1) c'est propre
2) ça évite de se prendre la tête quand il faut enfin s'y mettre
 
Autre chose: en lisant ton code de ton 1er post, je vois une "struct sac" (en minuscule) puis des fonctions de type "Sac" (avec une majuscule). S'agit-il d'une erreur ? Est-ce que "Sac = struct sac *" ?
Essaye de nommer tes structures "s_qqchose" et tes types "t_qqchose". Le lecteur qui n'est pas dans ta tête pourra mieux comprendre quoi représente quoi pour toi...


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

Marsh Posté le 18-04-2006 à 16:01:13    

Makapouf a écrit :

Tout marche en fait,


Ah bon ! Alors affaire reglée !


Message édité par Emmanuel Delahaye le 18-04-2006 à 16:01:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 16:09:30    

Sve@r a écrit :

Faut toujours libérer ce qui a été alloué.
1) c'est propre
2) ça évite de se prendre la tête quand il faut enfin s'y mettre
 
Autre chose: en lisant ton code de ton 1er post, je vois une "struct sac" (en minuscule) puis des fonctions de type "Sac" (avec une majuscule). S'agit-il d'une erreur ? Est-ce que "Sac = struct sac *" ?
Essaye de nommer tes structures "s_qqchose" et tes types "t_qqchose". Le lecteur qui n'est pas dans ta tête pourra mieux comprendre quoi représente quoi pour toi...


oui Sac = struct sac *
en fait c'est mis dans le Sac.h que j'ai ajouté apres.
 
Sinon oui tout marche sans les free(), mais je veux faire quelque chose de plus propre, car quand je lui demande de traiter plus de chose , il comence a prendre 1go de place mémoire :/ Pourtant c'est pas un programme compliqué, c'est "le compte est bon" tu lui donne un certain nombre de chiffre il evalue tout les possibilité possible pour atteindre un résultat voulu. Seul problème, c'est que si je lui donne 5 chiffre ça va, mais 6 chiffre ils sature totalement la mémoire virtuel :/
 
Sinon je crois que je vais reprendre mes structure a 0, en vidant corectement systématiquement. même si je comprend pas trop pourquoi ce que j'ai posterne marche pas.
 
Merci quand même


---------------
La raison est la mesure de toutes choses!   Venez découvrir de la peinture pointilliste
Reply

Sujets relatifs:

Leave a Replay

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