Sa fonction vide_liste, oui, absolument...Citation:
Envoyé par hunter99
La fonction sur laquelle j'ai réagit, c'est celle d'ajout d'éléments ;)
Version imprimable
Sa fonction vide_liste, oui, absolument...Citation:
Envoyé par hunter99
La fonction sur laquelle j'ai réagit, c'est celle d'ajout d'éléments ;)
la fonction de MR Emmanuel garde le premier noeud en memoire.Vu qu'il a fait un passage par valeur sa fonction vider_liste va vider une copie du premier noeud et tous les autres noeuds ensuite c bien ça ?
On parle bien de ça ?Citation:
Envoyé par hunter99
Je ne vois pas de problèmes dans ce code. Je l'ai passé au détecteurs de mensonges :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 /* EDIT : forçage de la tête (de noeud, mouarf!) à NULL */ void vider_liste (noeud **pn) { noeud *n = *pn; while (n != NULL) { noeud *temp = n; n = n->svt; free (temp); } *pn = NULL; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Usage xxx[ /T][ /E][ /O][ <options application>] FRMWRK.DBG_SYSALLOC=1 SYSALLOC Overload (85 rec) SYSALLOC Successful initialization: 85 records available SYSALLOC 'M 003D3BA8 8 4294967295 24:main.c' SYSALLOC 'M 003D3B98 8 4294967295 24:main.c' SYSALLOC 'M 003D3B88 8 4294967295 24:main.c' 1 -> 2 -> 3 -> NIL SYSALLOC 'F 003D3BA8 0 4294967295 54:main.c' SYSALLOC 003D3BA8 matched SYSALLOC 'F 003D3B98 0 4294967295 54:main.c' SYSALLOC 003D3B98 matched SYSALLOC 'F 003D3B88 0 4294967295 54:main.c' SYSALLOC 003D3B88 matched SYSALLOC min=4294967295 max=4294967295 delta=0 SYSALLOC All-matched SYSALLOC Released Memory FRMWRK.Termine Press ENTER to continue.
Citation:
la fonction de MR Emmanuel garde le premier noeud en memoire.Vu qu'il a fait un passage par valeur sa fonction vider_liste va vider une copie du premier noeud et tous les autres noeuds ensuite c bien ça ?
non je parlais de ça :Citation:
On parle bien de ça ?
Code:
1
2
3
4
5
6
7
8
9
10 void vider_liste (noeud *n) { noeud *temp = n; while (n != NULL) { temp = n; n = n->svt; free (temp); } }
Laisse tomber ce code là. Je l'ai effacé. C'est le 2ème qui fonctionne.Citation:
Envoyé par hunter99
slt,:coucou: j'ai essayé ta fonction et elle marche:) , apparement le probleme vient de ma fonction d'ajout mais j'ai pas compris sa cause :( .En effet lrsq j'ajoute un element avec ma fonction ajout_liste_qui_plante ça marche niquel mais si je la vide ça plante , alors que la meme maneuvre fonctionne avec ajouter_liste de MR Emmanuel :aie: ! j'ai essayé le debug mais le resultat des 2 fonctions d'ajout est identique.Svp est ce que qlqn peut m'expliquer la cause du probleme ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 #include <stdio.h> f merci #include <stdlib.h> typedef struct noeud { int val; struct noeud* svt; }noeud; void ajouter_liste_qui_plante (noeud ** n, int val) // ma fonction qui cause le // le plantage { noeud *temp=*n; if (temp==NULL) { *n=malloc(sizeof *n); (*n)->svt=NULL; (*n)->val=val; } else { while (temp->svt!=NULL) { temp=temp->svt; } temp->svt=malloc(sizeof *temp->svt); temp=temp->svt; temp->svt=NULL; temp->val=val; } } void ajouter_liste (noeud ** n, int val)// fct d'Emmanuel { noeud *new = malloc (sizeof *new); if (new != NULL) { new->val = val; new->svt = NULL; if (*n == NULL) { *n = new; } else { noeud *p = *n; while (p->svt != NULL) { p = p->svt; } p->svt = new; } } } void vider_liste (noeud **pn)// fct d'Emmanuel { noeud *n = *pn; while (n != NULL) { noeud *temp = n; n = n->svt; free (temp); } *pn = NULL; } int main() { noeud *n=NULL,*m=NULL; ajouter_liste_qui_plante(&n,1); ajouter_liste_qui_plante(&n,2); ajouter_liste(&m,1); ajouter_liste(&m,2); vider_liste(&n); vider_liste(&m); return 0; }
Pour moi les deux fonctions se comportent normalement.Citation:
Envoyé par hunter99
etCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Usage xxx[ /T][ /E][ /O][ <options application>] FRMWRK.DBG_SYSALLOC=1 SYSALLOC Overload (85 rec) SYSALLOC Successful initialization: 85 records available SYSALLOC 'M 003D3B70 4 4294967295 17:main.c' SYSALLOC 'M 003D3B60 8 4294967295 28:main.c' SYSALLOC 'M 003D3B50 8 4294967295 28:main.c' SYSALLOC 'M 003D2430 8 4294967295 28:main.c' 1 -> 2 -> 3 -> 4 -> NIL SYSALLOC 'F 003D3B70 0 4294967295 69:main.c' SYSALLOC 003D3B70 matched SYSALLOC 'F 003D3B60 0 4294967295 69:main.c' SYSALLOC 003D3B60 matched SYSALLOC 'F 003D3B50 0 4294967295 69:main.c' SYSALLOC 003D3B50 matched SYSALLOC 'F 003D2430 0 4294967295 69:main.c' SYSALLOC 003D2430 matched SYSALLOC min=4294967295 max=4294967295 delta=0 SYSALLOC All-matched SYSALLOC Released Memory FRMWRK.Termine Press ENTER to continue.
Avec ce code :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Usage xxx[ /T][ /E][ /O][ <options application>] FRMWRK.DBG_SYSALLOC=1 SYSALLOC Overload (85 rec) SYSALLOC Successful initialization: 85 records available SYSALLOC 'M 003D3B70 8 4294967295 38:main.c' SYSALLOC 'M 003D3B60 8 4294967295 38:main.c' SYSALLOC 'M 003D3B50 8 4294967295 38:main.c' SYSALLOC 'M 003D2430 8 4294967295 38:main.c' 1 -> 2 -> 3 -> 4 -> NIL SYSALLOC 'F 003D3B70 0 4294967295 69:main.c' SYSALLOC 003D3B70 matched SYSALLOC 'F 003D3B60 0 4294967295 69:main.c' SYSALLOC 003D3B60 matched SYSALLOC 'F 003D3B50 0 4294967295 69:main.c' SYSALLOC 003D3B50 matched SYSALLOC 'F 003D2430 0 4294967295 69:main.c' SYSALLOC 003D2430 matched SYSALLOC min=4294967295 max=4294967295 delta=0 SYSALLOC All-matched SYSALLOC Released Memory FRMWRK.Termine Press ENTER to continue.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 #include <stdio.h> #include <stdlib.h> typedef struct noeud { int val; struct noeud *svt; } noeud; #if 0 // ma fonction qui cause le // le plantage void ajouter_liste (noeud ** n, int val) { if (*n == NULL) { *n = malloc (sizeof *n); (*n)->svt = NULL; (*n)->val = val; } else { noeud *temp = *n; while (temp->svt != NULL) { temp = temp->svt; } temp->svt = malloc (sizeof *temp->svt); temp = temp->svt; temp->svt = NULL; temp->val = val; } } #else // fct d'Emmanuel void ajouter_liste (noeud ** n, int val) { noeud *new = malloc (sizeof *new); if (new != NULL) { new->val = val; new->svt = NULL; if (*n == NULL) { *n = new; } else { noeud *p = *n; while (p->svt != NULL) { p = p->svt; } p->svt = new; } } } #endif // fct d'Emmanuel void vider_liste (noeud ** pn) { noeud *n = *pn; while (n != NULL) { noeud *temp = n; n = n->svt; free (temp); } *pn = NULL; } void afficher_liste (noeud * n) { noeud *p = n; while (p != NULL) { printf ("%d -> ", p->val); p = p->svt; } printf ("NIL\n"); } int main (void) { noeud *n = NULL, *m = NULL; ajouter_liste (&n, 1); ajouter_liste (&n, 2); ajouter_liste (&n, 3); ajouter_liste (&n, 4); afficher_liste (n); vider_liste (&n); vider_liste (&m); return 0; }
tu a quoi comme compilo ? Est ce que tu peut l'essayer sur le visual 6 si c'est possible ?
merci :king:
MinGW.Citation:
Envoyé par hunter99
Je n'ai plus ça en magasin depuis longtemps. Le moins de Microsoft possible chez moi...Citation:
Est ce que tu peut l'essayer sur le visual 6 si c'est possible ?
tu pense que c'est normal que ça plante sous visual et que ça marche sous c::b:aie: ?
Non, mais comme je ne sais pas ce que tu appelles 'plante', je ne peux en dire plus.Citation:
Envoyé par hunter99
Dans ta fonction ajouter_liste_qui_plante, tu as (au moins) une erreur :
Peut être que ton pb. viens de là.Code:
1
2
3
4
5
6
7
8
9
10
11 void ajouter_liste_qui_plante (noeud ** n, int val) // ma fonction qui cause le // le plantage { ... else { ... // Erreur dans la ligne mis en commentaire // car il ne faut pas de * (alors qu'avec n, il faut bien une *) //temp->svt=malloc(sizeof *temp->svt); temp->svt=malloc(sizeof temp->svt);
mchk0123>j'ai reparé l'erreur mais ça ne change rien
Emmanuel>Damage after normal block (#42) at (une adresse)
42 ! Tout peut arriver ! :)Citation:
Envoyé par hunter99
Je ne vois pas.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void ajouter_liste_qui_plante(noeud ** n, int val) { noeud *temp=*n; if (temp==NULL) { *n=malloc(sizeof (noeud)); (*n)->svt=NULL; (*n)->val=val; } else { while (temp->svt!=NULL) { temp=temp->svt; } temp->svt=malloc(sizeof *temp->svt); temp=temp->svt; temp->svt=NULL; temp->val=val; } }
Faux.Citation:
Envoyé par mchk0123
est correct.Citation:
temp->svt=malloc(sizeof *temp->svt);
http://emmanuel-delahaye.developpez....tes.htm#malloc
Oui bien vu. On peut aussi mettre sizeof **n.Citation:
Envoyé par stephl
-> PO : C'est ça ton bug.
n étant un **, la taille de *n est cette d'un pointeur. Pour avoir la taille de l'objet pointé, c'est sizeof *(*n) ou sizeof **n.Citation:
Code:
1
2
3
4
5 void ajouter_liste (noeud ** n, int val) { if (*n == NULL) { *n = malloc (sizeof *n);
C'est un comportement indéfini, tout peut arriver, y compris un comportement d'apparence normal.
J'évite les pointeurs doubles au maximum. Trop de risques d'erreurs. Tu remarqueras que dans ma correction, je suis instinctivement descendu d'un niveau. Je ne manipule le ** qu'en fin de course.
Attention, j'ai corrigé mon post précédent. J'avais oublié les parenthèses autour du nom de type pour sizeof.
Merci bcp c’est bien ça .
Moralité de l’histoire : faire gaffe au pointeur double :mrgreen:
Mes excuses les plus ....Citation:
Envoyé par Emmanuel Delahaye
J'ai rajouté un bug là où il n'y en avait pas,
mais à la même ligne que l'autre alternative où il en avait un !
Je doit avoir les neurones qui se touchent avec l'âge ! :mouarf: