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

  FORUM HardWare.fr
  Programmation
  C

  Pb sur un prog

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Pb sur un prog

n°621549
Juntao2k2
Posté le 26-01-2004 à 00:12:15  profilanswer
 

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
mood
Publicité
Posté le 26-01-2004 à 00:12:15  profilanswer
 

n°621550
Taz
bisounours-codeur
Posté le 26-01-2004 à 00:18:32  profilanswer
 

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

n°621551
verdoux
And I'm still waiting
Posté le 26-01-2004 à 00:18:34  profilanswer
 

Le prog a perdu la tête.

n°621553
Juntao2k2
Posté le 26-01-2004 à 00:27:05  profilanswer
 

@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 ???

n°621554
Taz
bisounours-codeur
Posté le 26-01-2004 à 00:30:23  profilanswer
 

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

n°621556
Juntao2k2
Posté le 26-01-2004 à 00:44:44  profilanswer
 

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
n°621557
Taz
bisounours-codeur
Posté le 26-01-2004 à 00:50:08  profilanswer
 

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

n°621558
black_lord
Truth speaks from peacefulness
Posté le 26-01-2004 à 00:50:29  profilanswer
 

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 ???

n°621559
Juntao2k2
Posté le 26-01-2004 à 00:53:56  profilanswer
 

pq tu reponds ca ??? :??:

n°621560
Taz
bisounours-codeur
Posté le 26-01-2004 à 00:55:04  profilanswer
 

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

mood
Publicité
Posté le 26-01-2004 à 00:55:04  profilanswer
 

n°621561
Juntao2k2
Posté le 26-01-2004 à 00:56:39  profilanswer
 

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

n°621562
Taz
bisounours-codeur
Posté le 26-01-2004 à 00:57:15  profilanswer
 

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

n°621564
Taz
bisounours-codeur
Posté le 26-01-2004 à 01:06:17  profilanswer
 

               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à

n°621565
Juntao2k2
Posté le 26-01-2004 à 01:14:27  profilanswer
 

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
n°621567
Taz
bisounours-codeur
Posté le 26-01-2004 à 01:19:47  profilanswer
 

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)

n°621569
Juntao2k2
Posté le 26-01-2004 à 01:23:11  profilanswer
 

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
n°621571
Taz
bisounours-codeur
Posté le 26-01-2004 à 01:28:04  profilanswer
 

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

n°621572
Juntao2k2
Posté le 26-01-2004 à 01:32:02  profilanswer
 

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
n°621574
Taz
bisounours-codeur
Posté le 26-01-2004 à 01:42:15  profilanswer
 

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

n°621578
Juntao2k2
Posté le 26-01-2004 à 01:46:23  profilanswer
 

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

n°621579
Taz
bisounours-codeur
Posté le 26-01-2004 à 01:47:37  profilanswer
 

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

n°621580
gilou
Modérateur
Modzilla
Posté le 26-01-2004 à 01:50:56  profilanswer
 

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é!  --
n°622202
Juntao2k2
Posté le 26-01-2004 à 19:31:09  profilanswer
 

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
n°622266
gilou
Modérateur
Modzilla
Posté le 26-01-2004 à 21:06:27  profilanswer
 

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é!  --
n°622291
Juntao2k2
Posté le 26-01-2004 à 21:28:22  profilanswer
 

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

n°622315
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 26-01-2004 à 21:37:45  profilanswer
 

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)
n°622353
Juntao2k2
Posté le 26-01-2004 à 22:14:48  profilanswer
 

c'est irc qui deteint :/


Message édité par Juntao2k2 le 26-01-2004 à 22:20:33
n°622356
black_lord
Truth speaks from peacefulness
Posté le 26-01-2004 à 22:23:42  profilanswer
 

reteint vite alors :D

n°622373
Juntao2k2
Posté le 26-01-2004 à 22:37:42  profilanswer
 

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

n°622708
Zipo
Ours bipolaire
Posté le 27-01-2004 à 12:33:14  profilanswer
 

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
n°622714
Taz
bisounours-codeur
Posté le 27-01-2004 à 12:38:38  profilanswer
 

fout les NULL bordel et tu verras bien

n°623131
Juntao2k2
Posté le 27-01-2004 à 21:49:01  profilanswer
 

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

n°623193
Zipo
Ours bipolaire
Posté le 27-01-2004 à 22:46:53  profilanswer
 

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
n°623247
gilou
Modérateur
Modzilla
Posté le 27-01-2004 à 23:20:39  profilanswer
 

> 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é!  --
n°623512
Juntao2k2
Posté le 28-01-2004 à 09:19:42  profilanswer
 

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
n°623513
Taz
bisounours-codeur
Posté le 28-01-2004 à 09:33:21  profilanswer
 

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

n°623521
Juntao2k2
Posté le 28-01-2004 à 09:42:01  profilanswer
 

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

n°623556
chrisbk
-
Posté le 28-01-2004 à 10:19:38  profilanswer
 

efface ce post, vite !


Message édité par chrisbk le 28-01-2004 à 10:19:48
n°623681
Taz
bisounours-codeur
Posté le 28-01-2004 à 12:14:39  profilanswer
 

trop tard je l'ai vu :o

n°623688
Zipo
Ours bipolaire
Posté le 28-01-2004 à 12:19:36  profilanswer
 

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


---------------
- mon feed-back
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  Pb sur un prog

 

Sujets relatifs
Recherche prog Ti89 maths sur les limites niveau EcoGestion 1ere annéeProg avec fenêtre graphique
[C / C++] Recherche de doc + Prog répartiepb de coompilation d'un prog GUI avec GTK
le vb est il un langage de prog?[Programmation C] Modulo - pb de comprehension du prog
Creation d'un DSN a partir d'un prog javaUn programme en C# est-il aussi performant qu'un prog en C++ ?
Problème de requête SQL dans un prog. en VBprog simple : creer un fichier txt commandé sous visual basic
Plus de sujets relatifs à : Pb sur un prog


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