Gestion de bibliothéque dynamique
Fermé
ouled omar ilyes
-
9 janv. 2014 à 11:29
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 9 janv. 2014 à 14:20
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 9 janv. 2014 à 14:20
A voir également:
- Gestion de bibliothéque dynamique
- Tableau croisé dynamique - Guide
- Liste déroulante dynamique excel - Guide
- Logiciel gestion photo gratuit - Guide
- Bibliothèque dynamique aacs - Forum Windows
3 réponses
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 9/01/2014 à 12:14
Modifié par [Dal] le 9/01/2014 à 12:14
Salut ouled omar ilyes,
Je n'ai pas lu, ni testé ton programme, qui est très long.
Si tu penses que ton problème est lié à l'allocation de mémoire, tu peux essayer d'utiliser un outil te permettant de repérer les fuites mémoire.
Sous Linux, Valgrind est un outil excellent pour cela.
Sous Windows (et ailleurs), j'ai utilisé par le passé libmss http://libmss.sourceforge.net
Mais il y en a beaucoup d'autres (gratuits et payants).
Dal
Je n'ai pas lu, ni testé ton programme, qui est très long.
Si tu penses que ton problème est lié à l'allocation de mémoire, tu peux essayer d'utiliser un outil te permettant de repérer les fuites mémoire.
Sous Linux, Valgrind est un outil excellent pour cela.
Sous Windows (et ailleurs), j'ai utilisé par le passé libmss http://libmss.sourceforge.net
Mais il y en a beaucoup d'autres (gratuits et payants).
Dal
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
9 janv. 2014 à 12:17
9 janv. 2014 à 12:17
Salut.
Utilise les balises de code pour mettre autant de ligne. Car là, c'est illisible.
Je ne sais pas si ça viens de ça, mais cette façon de faire est débile :
Utilise les balises de code pour mettre autant de ligne. Car là, c'est illisible.
Je ne sais pas si ça viens de ça, mais cette façon de faire est débile :
head=/*(personne*)*/malloc(sizeof(personne)); head=NULL;Tu alloues de l'espace mémoire de la taille d'une personne, que tu référence dans "head" et ensuite, tu fait pointé "head" ailleurs. Donc, ton allocation mémoire est perdue ! Et j'en ai vu pas mal des écritures de ce genre !
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
9 janv. 2014 à 14:20
9 janv. 2014 à 14:20
Char Snipeur a raison,
Tu peux remplacer le code qu'il te signale par le code suivant :
qui sera bien plus utile.
Il n'y a aucun free() dans ton code... C'est un peu ennuyeux. Chaque allocation de mémoire avec alloc doit correspondre à un free.
De plus, quand tu fais :
Tes allocations ne servent à rien (outre le fait que tu les écrases et que tu ne les libères pas), puisque tu te contentes d'utiliser le pointeur pointé par head que tu affectes à p (et donc il est de la responsabilité de la fonction appelante de vérifier que le pointeur pointe sur une zone mémoire effectivement allouée).
Donc, ce code donnera le même résultat, sans fuites mémoire et en plus simplifié :
Ce type d'erreurs est également fréquemment répété dans de nombreuses parties de ton code.
Dal
Tu peux remplacer le code qu'il te signale par le code suivant :
head = /*(personne*)*/malloc(sizeof(personne)); if (head == NULL) { perror("Erreur : impossible d'allouer la mémoire"); exit(EXIT_FAILURE); }
qui sera bien plus utile.
Il n'y a aucun free() dans ton code... C'est un peu ennuyeux. Chaque allocation de mémoire avec alloc doit correspondre à un free.
De plus, quand tu fais :
int existe(personne*head, int CIN) { personne*p; p = /*(personne*)*/malloc(sizeof(personne)); p = NULL; p->next = /*(personne*)*/malloc(sizeof(personne)); p->next = NULL; p = head; while ((p->next != NULL )||(p->CIN!= CIN)){ p= p->next; } if (p->next != NULL ) { return 1; } else { return 0; }; }
Tes allocations ne servent à rien (outre le fait que tu les écrases et que tu ne les libères pas), puisque tu te contentes d'utiliser le pointeur pointé par head que tu affectes à p (et donc il est de la responsabilité de la fonction appelante de vérifier que le pointeur pointe sur une zone mémoire effectivement allouée).
Donc, ce code donnera le même résultat, sans fuites mémoire et en plus simplifié :
int existe(personne*head, int CIN) { personne*p; p = head; while ((p->next != NULL )||(p->CIN!= CIN)) p = p->next; if (p->next != NULL ) return 1; return 0; }
Ce type d'erreurs est également fréquemment répété dans de nombreuses parties de ton code.
Dal