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é:

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);
    }
}
Maintenant, le problème que j'ai découvert en utilisant Valgrind.
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:

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...]
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)
[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)
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!

Si quelqu'un a la moindre idée de ce qui se passe là, je suis preneur.

Merci par avance,
Mickaël