Algo_TP5.7z
Bonjour je vous contacte car j'ai un petit soucis avec ce code je n'arrive pas à avoir un résultat dans le terminal. Pourtant le code ne m'indique aucune erreur?
En espérant que vous puissiez m'aider.
Algo_TP5.7z
Bonjour je vous contacte car j'ai un petit soucis avec ce code je n'arrive pas à avoir un résultat dans le terminal. Pourtant le code ne m'indique aucune erreur?
En espérant que vous puissiez m'aider.
J'ai également la même chose pour deux autres codes.
En espérant que vous puissiez m'aider car pourtant mes codes je pense qu'ils sont bons non ?
Algo_TP2.7z
Algo_TP1.7z
Bonjour,
le code est bugué :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 $ valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./arbreB ==43310== Memcheck, a memory error detector ==43310== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==43310== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info ==43310== Command: ./arbreB ==43310== ==43310== Invalid write of size 8 ==43310== at 0x109469: nouveau_noeud (arbreB.c:143) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== Address 0x4a40058 is 16 bytes after a block of size 8 alloc'd ==43310== at 0x483E7C5: malloc (vg_replace_malloc.c:380) ==43310== by 0x10944A: nouveau_noeud (arbreB.c:139) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== ==43310== Invalid write of size 8 ==43310== at 0x109475: nouveau_noeud (arbreB.c:144) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== Address 0x4a40048 is 0 bytes after a block of size 8 alloc'd ==43310== at 0x483E7C5: malloc (vg_replace_malloc.c:380) ==43310== by 0x10944A: nouveau_noeud (arbreB.c:139) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== ==43310== Invalid write of size 8 ==43310== at 0x109481: nouveau_noeud (arbreB.c:145) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== Address 0x4a40050 is 8 bytes after a block of size 8 alloc'd ==43310== at 0x483E7C5: malloc (vg_replace_malloc.c:380) ==43310== by 0x10944A: nouveau_noeud (arbreB.c:139) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== ==43310== Invalid read of size 8 ==43310== at 0x109511: inserer (arbreB.c:170) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== Address 0x4a40048 is 0 bytes after a block of size 8 alloc'd ==43310== at 0x483E7C5: malloc (vg_replace_malloc.c:380) ==43310== by 0x10944A: nouveau_noeud (arbreB.c:139) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== ==43310== Invalid write of size 8 ==43310== at 0x109469: nouveau_noeud (arbreB.c:143) ==43310== by 0x109538: inserer (arbreB.c:181) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== Address 0x4a400a8 is 16 bytes after a block of size 8 alloc'd ==43310== at 0x483E7C5: malloc (vg_replace_malloc.c:380) ==43310== by 0x10944A: nouveau_noeud (arbreB.c:139) ==43310== by 0x109538: inserer (arbreB.c:181) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== et ça continue encore et encore
Même pour les codes TP1 et 2 ?
Je ne comprends pas pourquoi pourtant je n'ai aucune erreur non ?
Ce n'est pas parce que le compilo ne produit pas de messages d'erreurs que pour autant le code est correct. Je n'ai pas même lu ton code, je n'ai qu'utilisé des outils pour débuguer. En l'occurrence, j'ai utilisé valgrind pour vérifier tes accès mémoires, et ils sont fautifs, le log te donne même les endroits … Par exemple pour la première erreur :
valgrind te dit que dans main à la ligne 388 tu appelles la fonction inserer qui elle-même appelle nouveau_noeud en ligne 158 ; dans nouveau_noeud en ligne 139 tu alloues un espace mémoire de taille 8 bytes. Dans la même fonction tu essayes d'écrire 16 bytes après cette portion de mémoire allouée ! Cela provoque une erreur …
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ==43310== Invalid write of size 8 ==43310== at 0x109469: nouveau_noeud (arbreB.c:143) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310== Address 0x4a40058 is 16 bytes after a block of size 8 alloc'd ==43310== at 0x483E7C5: malloc (vg_replace_malloc.c:380) ==43310== by 0x10944A: nouveau_noeud (arbreB.c:139) ==43310== by 0x1094BC: inserer (arbreB.c:158) ==43310== by 0x1099DA: main (arbreB.c:388) ==43310==
Alors si on regarde de plus près le code de la fonction nouveau_noeud :
on voit que tu alloues de la mémoire mais que très certainement le sizeof est incorrect. Je suppose que tu as voulu écrire x = malloc(sizeof(struct noeud_s). C'est toujours, mais toujours, une mauvaise idée que de cacher un pointeur dans un typedef.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 b_t nouveau_noeud(element_t a){ ab_t x; x = malloc(sizeof(ab_t*)); if (!x) { perror("Echec malloc"); } x->parent = NULL; x->gauche = NULL; x->droite = NULL; x->e = a; return x; }
Il est aussi souvent bien plus simple d'écrire x = malloc(sizeof *x) ; au moins tu es certain que la bonne taille sera allouée (dans la très grande majorité des cas, il y aura toujours quelques exceptions, mais en ce qui te concerne ce sera toujours bon).
J'ai débusqué une erreur dans ton code sans même le lire entièrement ni même essayer de le comprendre. C'est grâce aux outils de débugage … c'est indispensable de savoir s'en servir, car débuguer vcia un forum est non seulement lent mais il ne te permettra pas d'apprendre de tes erreurs puisqu'au fond tu ne les trouves pas.
Il va falloir apprendre à utiliser valgrind et un debuger pas à pas …
Ca y est j'ai finalement bien reussi a faire marcher le code par contre , pour les TP1 et 2 est ce le même problème? Parce que au niveau des allocations je n'ai pas vu de problème particulier ?
Je t'ai montré comment faire, n'as-tu pas essayé ?
Partager