Bonsoir à toutes et à tous,
Me voici une fois de plus confronté à un problème dont j'ignore encore la raison. Tout d'abord, le code simplifié:
Maintenant, le problème que j'ai découvert en utilisant Valgrind.
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 typedef struct { float x; float y; float z; } coordinates; unsigned short coord_size = sizeof(coordinates); char PDBFileName[250]; unsigned int maxNbPDBFiles = 60; unsigned int nbResidues = 59; unsigned int nbPDBFiles = 0; coordinates **atomCoords = malloc (maxNbPDBFiles * sizeof(coordinates *)); FILE *PDBListFile, *PDBFile; // PDBListFile contient une liste de fichiers qui seront ouvert grâce à PDBFile if ((PDBListFile = fopen(argv[PDBListFileNb], "r")) != NULL) { fgets(PDBFileName, 250, PDBListFile); while (!feof(PDBListFile)) { if (PDBFileName[strlen(PDBFileName)-1] == '\n') PDBFileName[strlen(PDBFileName)-1] = '\0'; if ((PDBFile = fopen(PDBFileName, "rt")) != NULL) { if (nbPDBFiles == maxNbPDBFiles) { printf ("\n\n\n\n\nREALLOCATION OF atomCoords\n\n\n\n\n"); maxNbPDBFiles += 100; if ((atomCoords = realloc (atomCoords, maxNbPDBFiles * sizeof(coordinates *))) == NULL) fatal_error("MEMORY", "extend the size of atomCoords variable"); } printf("\n\nnbPDBFiles = %u\t\tnbResidues = %u (%u)\n", nbPDBFiles, nbResidues, coord_size); atomCoords[nbPDBFiles] = malloc(nbResidues * coord_size); fgets(PDBFileLine, 79, PDBFile); while (!feof(PDBFile)) { /* Là, nous lisons le fichier PDBFileName. Ce dernier contient 59 lignes (d'où la valeur de la variable nbResidues), chacune des lignes contenant 3 valeurs (float): x, y et z. Chacune de ces valeurs est enregistrée dans la variable atomCoords[nbPDBFiles].*/ [...] fgets(PDBFileLine, 79, PDBFile); } fclose(PDBFile); } fgets(PDBFileName, 250, PDBListFile); } }
Quand j'utilise pour la variable maxNbPDBFiles une valeur d'initialisation strictement inférieure à 60, aucun problème n'est rencontré. J'ai les lignes suivantes qui s'affiche:
Maintenant, si j'utilise une valeur d'initialisation d'au moins 60, et ce, SANS NE RIEN TOUCHER D'AUTRE AU PROGRAMME, Valgrind me sort:nbPDBFiles = 1 nbResidues = 59 (12)
nbPDBFiles = 2 nbResidues = 59 (12)
nbPDBFiles = 3 nbResidues = 59 (12)
nbPDBFiles = 4 nbResidues = 59 (12)
[Je passe là le superflu...]
nbPDBFiles = 57 nbResidues = 59 (12)
nbPDBFiles = 58 nbResidues = 59 (12)
nbPDBFiles = 59 nbResidues = 59 (12)
nbPDBFiles = 60 nbResidues = 59 (12)
nbPDBFiles = 61 nbResidues = 59 (12)
nbPDBFiles = 62 nbResidues = 59 (12)
[Le reste se déroule de la même façon, sans souci...]
Le pire, c'est que, dans ce cas, ça aboutit à une erreur de segmentation lors de la lecture de ma variable atomCoords tout à la fin de mon programme, une fois que toutes les valeurs ont été enregistrées!nbPDBFiles = 1 nbResidues = 59 (12)
nbPDBFiles = 2 nbResidues = 59 (12)
nbPDBFiles = 3 nbResidues = 59 (12)
[Je passe là le superflu...]
nbPDBFiles = 57 nbResidues = 59 (12)
nbPDBFiles = 58 nbResidues = 59 (12)
nbPDBFiles = 59 nbResidues = 59 (12)
==6323== Invalid write of size 4
==6323== at 0x8048EB6: main (contact_map.c:101)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
==6323==
==6323== Invalid read of size 4
==6323== at 0x8049060: main (contact_map.c:140)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
==6323==
==6323== Invalid read of size 4
==6323== at 0x8049091: main (contact_map.c:142)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
==6323==
==6323== Invalid read of size 4
==6323== at 0x80490C3: main (contact_map.c:144)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
--6323-- REDIR: 0xC81400 (mempcpy) redirected to 0x4006B70 (mempcpy)
nbPDBFiles = 60 nbResidues = 59 (12)
nbPDBFiles = 61 nbResidues = 59 (12)
nbPDBFiles = 62 nbResidues = 59 (12)
Si quelqu'un a la moindre idée de ce qui se passe là, je suis preneur.
Merci par avance,
Mickaël
Partager