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

  FORUM HardWare.fr
  Programmation
  C

  Probleme de free sur une structure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de free sur une structure

n°1348708
Makapouf
Posté le 18-04-2006 à 12:39:10  profilanswer
 

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
mood
Publicité
Posté le 18-04-2006 à 12:39:10  profilanswer
 

n°1348778
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-04-2006 à 14:12:15  profilanswer
 

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/
n°1348788
Makapouf
Posté le 18-04-2006 à 14:20:27  profilanswer
 

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
n°1348836
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-04-2006 à 15:08:16  profilanswer
 

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/
n°1348913
Makapouf
Posté le 18-04-2006 à 15:47:53  profilanswer
 

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
n°1348930
Sve@r
Posté le 18-04-2006 à 15:55:35  profilanswer
 

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.
n°1348941
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-04-2006 à 16:01:13  profilanswer
 

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/
n°1348955
Makapouf
Posté le 18-04-2006 à 16:09:30  profilanswer
 

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

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

  Probleme de free sur une structure

 

Sujets relatifs
Probleme d'execution JS (Via AJAX)XML/XSL Probleme de vitesse d'execution Javascript
Problème - variable non récupéréecreation des instrances d'objet contexte Probleme ?
probleme nvu[Delphi] probleme requete nil
Problème avec fenêtre graphiqueHTML probleme avec tableau tres complexe
[Problème de variables dans des conditions][Python]Problème de gestion de liste chainée
Plus de sujets relatifs à : Probleme de free sur une structure


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