Suppression arbre binaire [C] - C++ - Programmation
Marsh Posté le 22-04-2002 à 14:47:19
bah groumf... voilà les structures que j'utilise :
typedef struct _LIVRE
{
char* titre;
char* auteur;
short nbpages;
char ISBN[15];
char emprunt[30];
time_t date;
} LIVRE;
typedef struct _NOEUD
{
LIVRE media;
struct _NOEUD *droite;
struct _NOEUD *gauche;
} NOEUD;
Alors
Marsh Posté le 22-04-2002 à 16:29:19
Deja, ou sont stockes "auteur" et "titre" ?
Lance ton programme en debug, et tu verras bien ou il se crashe.
Tu es sur que tu detruis par deux fois un arbre ?
Marsh Posté le 22-04-2002 à 16:34:24
bah j'initialise un noeud comme ça :
NOEUD* Noeud;
Noeud = (NOEUD*)malloc(sizeof(NOEUD));
Noeud->media.titre = (char*)malloc(sizeof(char));
Noeud->media.auteur = (char*)malloc(sizeof(char));
Noeud->droite = NULL;
Noeud->gauche = NULL;
et la fonction de suppression crashe au premier free() qu'elle doit effectuer.
Marsh Posté le 22-04-2002 à 17:44:33
[ ZeD ] a écrit a écrit : bah j'initialise un noeud comme ça : NOEUD* Noeud; Noeud = (NOEUD*)malloc(sizeof(NOEUD)); Noeud->media.titre = (char*)malloc(sizeof(char)); Noeud->media.auteur = (char*)malloc(sizeof(char)); Noeud->droite = NULL; Noeud->gauche = NULL; et la fonction de suppression crashe au premier free() qu'elle doit effectuer. |
Ca fait des chaines de 1 caractère allouées pour titre et auteur ça... si tu écris dans titre et auteur autre chose qu'un seul caractère, ça plante irrémédiablement à la libération de l'espace alloué au pointeur...
Fait "man malloc", tu verras que tu utilises mal cette fonction.
[jfdsdjhfuetppo]--Message édité par zi_ril_wanou le 22-04-2002 à 17:45:15--[/jfdsdjhfuetppo]
Marsh Posté le 22-04-2002 à 17:52:41
conclusion ça sert à rien d'utiliser un char* pour une chaine de caractères c ça ?
autant que je mette un char titre[50] si g bien compris ?
Marsh Posté le 22-04-2002 à 18:02:23
Pour faire simple oui
mais si tu depasses rarement 10 caracteres, ca fait a force une place non negligeable de perdue ...
le mieux est d'allouer au moment de l'affectation
au moment où tu dois copier titre et auteur, tu alloue ainsi :
Code :
|
et si tu dois les modifier, tu peux faire des realloc a la place des malloc (si media.titre vaut NULL, realloc fonctionne comme malloc)
n'oublie pas d'initialiser a NULL ces 2 champs quand tu initialises ton noeud (si ce n'est pas à ce moment que tu copies les chaines)
[jfdsdjhfuetppo]--Message édité par HelloWorld le 22-04-2002 à 18:03:53--[/jfdsdjhfuetppo]
Marsh Posté le 22-04-2002 à 18:02:59
[ ZeD ] a écrit a écrit : conclusion ça sert à rien d'utiliser un char* pour une chaine de caractères c ça ? autant que je mette un char titre[50] si g bien compris ? |
Si tu ne sais pas bien gérer ta mémoire oui.
Sinon, rien ne t'empèche de faire des fonctions NewTaStructure() et FreeTaStructure(TaStructure *ptStruct) qui font respectivement :
TaStructure *NewTaStructure() {
TaStructure *ptStruct;
ptStruct = (TaStructure *)calloc(1,sizeof(TaStructure));
ptStruct->TaChaine = (char *)malloc(50); // 50 ou la taille que tu veux.
return ptStruct;
}
TaStructure *FreeTaStructure(TaStructure *ptStruct) {
if (ptStruct) { // sous entendu ptStruct != NULL
if (ptStruct->TaChaine) {
free(ptStruct->TaChaine);
}
free(ptStruct);
}
return NULL;
}
Marsh Posté le 22-04-2002 à 18:08:02
Je comprend pas trop l'avantage d'allouer des chaines de taille fixes a la place de faire comme il dit (inclure directement char titre[50] dans la structure et se limiter a un Noeud = (NOEUD*)malloc(sizeof(NOEUD))
Marsh Posté le 22-04-2002 à 18:11:10
HelloWorld a écrit a écrit : Je comprend pas trop l'avantage d'allouer des chaines de taille fixes a la place de faire comme il dit (inclure directement char titre[50] dans la structure et se limiter a un Noeud = (NOEUD*)malloc(sizeof(NOEUD)) |
Dans son cas, il n'y en a pas.(10 ou 50 on s'en fout)
Par contre, dès lors que tu ne connais pas à priori la taille de la chaîne ou de l'objet à créer... (10 ou 1 000 000 octets) bah là ça change tout.
Marsh Posté le 22-04-2002 à 18:21:46
effectivement ça plante pu maintenant, merci bien !
Marsh Posté le 20-04-2002 à 15:41:43
Hello,
Voilà j'ai un arbre binaire tout con, mais j'arrive pas à le supprimer pour libérer la mémoire
j'avais pensé à une fonction dans ce genre mais g une erreur windows avec :
void SupprimeArbre(NOEUD* n)
{
if (n != NULL)
{
SupprimeArbre(n->gauche);
SupprimeArbre(n->droite);
free(n);
}
}
---------------
The N·Zone New Formation Official Website