Pb sur un prog

Pb sur un prog - C - Programmation

Marsh Posté le 26-01-2004 à 00:12:15    

Salut a tous,
 
G regarde et je ne comprend po pq ce prog plante quand je veux rendre la memoire au systeme.
Si qqn pouvait me renseigner ce serait super
 

Code :
  1. /* Insertion de nombres et tri dans l'ordre croissant,de la liste chaînée */
  2. #include <malloc.h>
  3. #include <stdio.h>
  4. struct Cellule
  5. {
  6.   int Valeur;
  7.   struct Cellule *Suivant;
  8. };
  9. int main()
  10. {int NombreSaisi;
  11. struct Cellule *Courant,*Precedent,*Tete=NULL;
  12.    printf("Saisissez une valeur (0 arrete la saisie)\n\r" );
  13.    scanf("%d",&NombreSaisi);
  14.    if(NombreSaisi!=0)
  15.      {
  16.        Tete=(struct Cellule *)malloc(sizeof(struct Cellule));
  17.        Tete->Valeur=NombreSaisi;
  18.        Tete->Suivant=NULL;
  19.        scanf("%d",&NombreSaisi);
  20.        while(NombreSaisi!=0)
  21.          {
  22.            Courant=Precedent=Tete;
  23.            while(Courant!=NULL && Courant->Valeur<NombreSaisi)
  24.              {
  25.                Precedent=Courant;
  26.                Courant=Courant->Suivant;
  27.              }
  28.            if(Courant==Tete)
  29.              {
  30.                Tete=(struct Cellule *)malloc(sizeof(struct Cellule));
  31.                Tete->Valeur=NombreSaisi;
  32.                Tete->Suivant=Courant;
  33.              }
  34.            else
  35.              {
  36.                if(Courant==NULL)
  37.                  {
  38.                    Precedent->Suivant=(struct Cellule *)malloc(sizeof(struct Cellule));
  39.                    Courant=Precedent->Suivant;
  40.                    Courant->Valeur=NombreSaisi;
  41.                    Courant->Suivant=NULL;
  42.                  }
  43.                else
  44.                  {
  45.                    Precedent->Suivant=(struct Cellule *)malloc(sizeof(struct Cellule));
  46.                    Precedent=Precedent->Suivant;
  47.                    Precedent->Valeur=NombreSaisi;
  48.                    Precedent->Suivant=Courant;
  49.                  }
  50.              }
  51.            scanf("%d",&NombreSaisi);
  52.          }
  53.        Courant=Tete;
  54.        while(Courant!=NULL)
  55.          {
  56.            printf("%d ",Courant->Valeur);
  57.            Precedent=Courant;
  58.            Courant=Courant->Suivant;
  59.            free(Precedent);
  60.          }
  61.      }
  62.    printf("\n\r" );
  63.    /* Les 3 lignes suivantes font planter le programme */
  64.    /*free(Courant);
  65.    free(Precedent);
  66.    free(Tete);*/
  67.    return 0;
  68. }


 
Merci
 
++


Message édité par Juntao2k2 le 26-01-2004 à 00:13:16
Reply

Marsh Posté le 26-01-2004 à 00:12:15   

Reply

Marsh Posté le 26-01-2004 à 00:18:32    

1) #include <malloc.h> -> <stdlib.h>
 
malloc.h n'existe pas
 
 
2) printf("\n\r" );
 
heink ? '\n' définit portablement la séquence de caractères qui représente le retour à la ligne
 
3) sans doute parce que tu libères plusieurs fois la même zone mémoire. mets tout pointeur à NULL directement après un free

Reply

Marsh Posté le 26-01-2004 à 00:18:34    

Le prog a perdu la tête.

Reply

Marsh Posté le 26-01-2004 à 00:27:05    

@Taz
 
ce que je ne comprend po c que g certain prog dans lesquels g omis stdlib, et ca me fait po ce pur plantage ??  :??:  
 
oui mais \n tt seul, c que pour windows ?? sous linux faudra mettre le \r pour qu'il y ait un retour chariot, non ??
spo utile de le mettre sous windows ??
 
pq faut remettre le pointeur a NULL apres un free ??
 
@Verdoux
 
a un moment du prog, Tete est perdu ?? a quel endroit stp ???

Reply

Marsh Posté le 26-01-2004 à 00:30:23    

non c'est sous windows ou il faut se taper \r\n
 
mais voir mon explication précédente fout '\n' quelque soit le système
 
malloc est défini dans <stdlib.h>
 
 
parceque free(NULL) est sans effet alors que free(déjà_libéré) fout tout en l'air
 
 
:o

Reply

Marsh Posté le 26-01-2004 à 00:44:44    

hum...
ah bon c sous windows ??
une machine a ecrire fait retour a la ligne puis retour chariot ??
mais sinon, mon prog te parait correct ou tu vois des choses qui te frappent ???


Message édité par Juntao2k2 le 26-01-2004 à 01:16:08
Reply

Marsh Posté le 26-01-2004 à 00:50:08    

1) quelque soit le système, si tu veux un retour à la ligne, tu fous un '\n' et c'est tout
2) rien à voir
3) tu le fais exprès ou quoi ? tout ce qui concerne l'allocation mémoire, malloc, realloc, calloc et free sont dans <stdlib.h>
4)
 
Tete=(struct Cellule *)malloc(sizeof(struct Cellule));  
 
->
 
Tete = malloc(sizeof(struct Cellule));
 
voire
 
Tete = malloc(sizeof *Tete);
 
 
les identificateur commençant par des majuscules sont par convention réservés au nom de type
 
prie pour que ton scanf fonctionne
sinon fgets + sscanf
 
fais une approche orientée objet pour séparer ton tad de liste et ton programme, parce que là c'est imbitable

Reply

Marsh Posté le 26-01-2004 à 00:50:29    

Juntao2k2 a écrit :

hum...
ah bon c sous windows ??
une machine a ecrire fait retour a la ligne puis retour chariot ??
donc dans mes progs ou je n'utilise que free il n'est pas necessaire d'inclure stdlib ??
man 3 free
mais sinon, mon prog te parait correct ou tu vois des choses qui te frappent ???

Reply

Marsh Posté le 26-01-2004 à 00:53:56    

pq tu reponds ca ??? :??:

Reply

Marsh Posté le 26-01-2004 à 00:55:04    

par ce que ça te ferait du bien de lire un peu de documentation :o

Reply

Marsh Posté le 26-01-2004 à 00:55:04   

Reply

Marsh Posté le 26-01-2004 à 00:56:39    

j'en lis mais n'ayant jms eu de pbs particuliers avec free, je me suis jms penche dessus

Reply

Marsh Posté le 26-01-2004 à 00:57:15    

ben si tu free plus d'une fois, tout par en couille :o

Reply

Marsh Posté le 26-01-2004 à 01:06:17    

               Precedent=Courant;
                   Courant=Courant->Suivant;
                   free(Precedent);
               }
         }
       printf("\n\r" );
       /* Les 3 lignes suivantes font planter le programme */
       /*free(Courant);
       free(Precedent);  
 
 
je le sens pas pour Precedent déjà

Reply

Marsh Posté le 26-01-2004 à 01:14:27    

l'enorme connerie que g dite sur le fait qu'il n'etait po necessaire d'inclure stdlib pour free, je m'excuse (je viens de regarder dans stdlib)
ainsi que pour le fait d'avoir dit que je ne free-ait po 2 fois
pq mon scanf ne fontionnerait po ??
qu'est ce que t'entends par la stp ==> "ton tad de liste" ???


Message édité par Juntao2k2 le 26-01-2004 à 01:22:59
Reply

Marsh Posté le 26-01-2004 à 01:19:47    

1) pour le scanf, vas y rentre un entier négatif ou autre chose qu'un entier
2) Type Abstrait de Donnée Liste . en gros sépare tout ce qui sert à jour avec une liste (création/destruction/ajout/recherche/etc) de tout ce qui utilise une liste (utilisant l'interface définie)

Reply

Marsh Posté le 26-01-2004 à 01:23:11    

c vrai t'as raison, si on saisi autre chose, ca va faire planter mechamment le prog
jms entendu parler de ca auparavant
pq n'est il po necessaire de mettre (struct Cellule *) devant le malloc(sizeof(struct Cellule)) ?? (p-e que mon prof se cantonne a la facon simple sans se prendre la tete)


Message édité par Juntao2k2 le 26-01-2004 à 01:25:11
Reply

Marsh Posté le 26-01-2004 à 01:28:04    

non il est pas nécessaire et même dangereux. si tu mets le cast et que tu oublies <stdlib.h>, ton compilateur va meme pas t'avertir. ton prof a comme beaucoup manqué ses bases de C
 
les convertions void * <-> truc * sont sures, implicites et parfaitement définies.
 
donc tu peux l'enlever ans problème et tu te rends compte que ton code n'en est que plus léger

Reply

Marsh Posté le 26-01-2004 à 01:32:02    

c p-e pour ca que ca me fait des trucs mechants ??
 
la 2eme solution que tu as mise est equivalente a celle du dessus ?? (Tete=malloc(sizeof *Tete))
 
http://www.cicrp.jussieu.fr/phynum/cours/C/c8.html <== eux aussi ils utilisent les casts


Message édité par Juntao2k2 le 26-01-2004 à 01:40:39
Reply

Marsh Posté le 26-01-2004 à 01:42:15    

ben c'est des marioles j'y peux quoi ?

Reply

Marsh Posté le 26-01-2004 à 01:46:23    

lol ;) non ct juste pour constatation que gv mis ca
et sinon concernant la 2eme solution ??
 
sur ces bonnes paroles, v te laisser, je repondrais demain
 
bonne nuit, merci bcp pour ton aide et tes conseils

Reply

Marsh Posté le 26-01-2004 à 01:47:37    

bah c'est la même chose, seulement si tu change le type de Tete, t'as pas à réécrire et ça t'évite une de faire une faute, et ça te permet aussi de pas te préocupper tu type de Tete, il sera alloué ce qu'il faut

Reply

Marsh Posté le 26-01-2004 à 01:50:56    

quand tu fais ceci:  

Code :
  1. Courant=Tete;
  2. while(Courant!=NULL)
  3. {
  4.   printf("%d ",Courant->Valeur);
  5.   Precedent=Courant;
  6.   Courant=Courant->Suivant;
  7.   free(Precedent);
  8. }


Tu libertes deja toute la liste chainée
Donc il est normal que:

Code :
  1. /* Les 3 lignes suivantes font planter le programme */
  2.   free(Courant);
  3.     free(Precedent);
  4.     free(Tete);


fasse planter le programme, puisque tu appelles free sur des pointeurs deja liberes ou nulls.
A+,


Message édité par gilou le 26-01-2004 à 01:52:30

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-01-2004 à 19:31:09    

Je ne vois po a quel moment la liste serait liberee, ni a quel Courant et Tete sont liberes ??  :/


Message édité par Juntao2k2 le 26-01-2004 à 19:34:31
Reply

Marsh Posté le 26-01-2004 à 21:06:27    

Juntao2k2 a écrit :

Je ne vois po a quel moment la liste serait liberee, ni a quel Courant et Tete sont liberes ??  :/


Pourtant c'est clair: tu liberes un par un les elements de ta liste chainée avec cette ligne.
free(Precedent);  
dans ton while.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-01-2004 à 21:28:22    

hum...
je pense avoir enfin compris (dsl pour le delai mais les listes et moi on est po super potes) mais y'a encore qqes details flous

Reply

Marsh Posté le 26-01-2004 à 21:37:45    

Juntao2k2 a écrit :

l'enorme connerie que g dite sur le fait qu'il n'etait po necessaire d'inclure stdlib pour free, je m'excuse (je viens de regarder dans stdlib)
ainsi que pour le fait d'avoir dit que je ne free-ait po 2 fois
pq mon scanf ne fontionnerait po
??
qu'est ce que t'entends par la stp ==> "ton tad de liste" ???


fais un effort sur la rédaction stp, c'est limite pénible à lire ton truc


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-01-2004 à 22:14:48    

c'est irc qui deteint :/


Message édité par Juntao2k2 le 26-01-2004 à 22:20:33
Reply

Marsh Posté le 26-01-2004 à 22:23:42    

reteint vite alors :D

Reply

Marsh Posté le 26-01-2004 à 22:37:42    

:lol:  :lol:  
c'est po evident vu que j'y suis tout le temps

Reply

Marsh Posté le 27-01-2004 à 12:33:14    

Ce qu'ils essayent de te faire comprendre c'est que dans ta boucle tu libères déja TOUTE ta liste, et que en sortant de la boucle tu veux encore libérer 3 élèment qui l'ont déja été. Et c'est cela qui fait planter ton prog.
En gros (j'ai pas lu toute la source mais juste la fin) vire les 3 lignes de la fin elles servent à rien.


---------------
- mon feed-back
Reply

Marsh Posté le 27-01-2004 à 12:38:38    

fout les NULL bordel et tu verras bien

Reply

Marsh Posté le 27-01-2004 à 21:49:01    

oki
la memoire est libere parce que dans le prog je fais
Courant=Tete puis Precedent=Courant et je free precedent, c bien ca :) ??
 

Reply

Marsh Posté le 27-01-2004 à 22:46:53    

Juntao2k2 a écrit :

oki
la memoire est libere parce que dans le prog je fais
Courant=Tete puis Precedent=Courant et je free precedent, c bien ca :) ??


 
Ben à chaque fois que tu passe dans cette boucle while :

Citation :

Courant=Tete;  
             while(Courant!=NULL)  
               {  
                   printf("%d ",Courant->Valeur);  
                   Precedent=Courant;  
                   Courant=Courant->Suivant;  
                   free(Precedent);  
               }


 
tu fais free(Precedent);  donc tu libère la mémoire pour l'élèment précédent.
Et tu passes dans la boucle de manière à ce que tous les élèments de ta liste soient libérés.
 
C'est toi qui a écrit la source :??:


---------------
- mon feed-back
Reply

Marsh Posté le 27-01-2004 à 23:20:39    

> C'est toi qui a écrit le source  
Je me suis aussi pose la question :D
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-01-2004 à 09:19:42    

Non c mon prof d'info
Je reprenais le prog pour qu'il soit propre (que ts les headers y soient et que la memoire soit bien rendu au systeme)


Message édité par Juntao2k2 le 28-01-2004 à 09:20:08
Reply

Marsh Posté le 28-01-2004 à 09:33:21    

sauf que <malloc.h> est de sa pure invention :o

Reply

Marsh Posté le 28-01-2004 à 09:42:01    

Ah bon ???
Pourtant dans le repertoire include de VS y'a un fichier malloc.h ??? :??::??:

Reply

Marsh Posté le 28-01-2004 à 10:19:38    

efface ce post, vite !


Message édité par chrisbk le 28-01-2004 à 10:19:48
Reply

Marsh Posté le 28-01-2004 à 12:14:39    

trop tard je l'ai vu :o

Reply

Marsh Posté le 28-01-2004 à 12:19:36    

C ton prof d'info qui l'a écrit ????
Mais c toi qua écrit free(Precedent); et    free(Tete);  à la fin ??


---------------
- mon feed-back
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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