Pb sur un prog - C - Programmation
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
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 ???
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
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 ???
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
Marsh Posté le 26-01-2004 à 00:50:29
Juntao2k2 a écrit : hum... |
Marsh Posté le 26-01-2004 à 00:55:04
par ce que ça te ferait du bien de lire un peu de documentation
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
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à
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" ???
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)
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)
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
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
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
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
Marsh Posté le 26-01-2004 à 01:50:56
quand tu fais ceci:
Code :
|
Tu libertes deja toute la liste chainée
Donc il est normal que:
Code :
|
fasse planter le programme, puisque tu appelles free sur des pointeurs deja liberes ou nulls.
A+,
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 ??
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+,
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
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) |
fais un effort sur la rédaction stp, c'est limite pénible à lire ton truc
Marsh Posté le 26-01-2004 à 22:14:48
c'est irc qui deteint
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.
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 ??
Marsh Posté le 27-01-2004 à 22:46:53
Juntao2k2 a écrit : oki |
Ben à chaque fois que tu passe dans cette boucle while :
Citation : Courant=Tete; |
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
Marsh Posté le 27-01-2004 à 23:20:39
> C'est toi qui a écrit le source
Je me suis aussi pose la question
A+,
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)
Marsh Posté le 28-01-2004 à 09:42:01
Ah bon ???
Pourtant dans le repertoire include de VS y'a un fichier malloc.h ???
Marsh Posté le 28-01-2004 à 10:19:38
efface ce post, vite !
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 ??
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
Merci
++
Message édité par Juntao2k2 le 26-01-2004 à 00:13:16