Bonjour, je travaille actuellement sur un programme que je compile dans un terminal sous la version 4 de Fedora. Or j'ai un problème lorsque je lance le programme il apparait un segmentation fault au niveau d'un fclose. J'ai vu sur le net que celà pouvait être du à un pointeur null. Mais il n'en est rien, le FILE* que je tente de fermer n'est pas null.

Autre chose si je compile sous windows avec DevC++ il n'y a aucun problème. (Mais bon je dois rendre ce programme de façon à ce qu'il marche sous linux).

Pourriez-vous m'aider, voici le code du programme, ainsi que le fichier ala.pdb que je lis et que je ferme.

lect_fich_pdb.c :

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
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
99
100
101
102
103
104
105
106
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NB_MAX 10000
 
typedef struct{
	float x, y, z;
}Position3D;
 
 
int get_atom_pdb(char *nom_fichier);
 
char* sous_chaine(char *dest,char *src, int deb, int fin);	//retourne la sous chaine de ch commençant à l'indice deb et terminant à fin
 
void init_tab_pos(Position3D *tab_pos, int *tab_indice,char *nom_fichier);
 
void init_moins_un(int *tab,int nb_elem);
 
void init_graphe_zero(char **graphe, int nb_atome);
 
void remplir_graphe(char* nomfichier,int* tab_indice,char** graphe);
 
int lectPDB(char *nom_fichier,Position3D *tab_pos,char **graphe);
 
char* sous_chaine(char *dest,char *src, int deb, int fin);
 
//##########PROGRAMME PRINCIPAL##########
int main(int argc, char **argv)
{
    char nom_pdb[30];
 
	char ** molecule;
	Position3D *lesAtomes;
	int i;
 
	int nbAtomes;
 
	printf("Entrez le nom du fichier et appuyer sur entree :\n");
	scanf("%s",nom_pdb);
 
 
	molecule = (char **)calloc(NB_MAX, sizeof(char *));
	lesAtomes = (Position3D *)calloc(NB_MAX, sizeof(Position3D));
	for(i=0;i<NB_MAX; i++)
		molecule[i] = (char *)calloc(NB_MAX, sizeof(char ));
 
 
	nbAtomes = lectPDB(nom_pdb, lesAtomes,  molecule);
//desallocation
	free(lesAtomes);
	for(i=0;i<NB_MAX; i++)
		free(molecule[i]);
	free(molecule);
 
	return 0;
}
 
//###########IMPLEMENTATION DES FONCTIONS############
char* sous_chaine(char *dest,char *src, int deb, int fin){
 
	dest=strncpy(dest,src+deb,fin-deb);
	dest[fin]='\0';
	return dest;
}
 
int get_atom_pdb(char *nom_fichier){ //retourne le nombre d'atome du fichier pdb pour allocation dynamique
	char ligne[81];	//on stockera chaque ligne tour a tour dans ce tableau
	char *deb_ligne; //debut de la ligne
	FILE* fichier;
	int nb_atom=0;
 
	deb_ligne=(char*)malloc(4*sizeof(char));
	fichier=fopen(nom_fichier,"r");
 
	while(fgets(ligne,sizeof(ligne),fichier)!=NULL){ //tant qu'il reste des lignes a lire
		if(strcmp(sous_chaine(deb_ligne,ligne,0,4),"ATOM")==0 || strcmp(sous_chaine(deb_ligne,ligne,0,6),"HETATM")==0){
            		nb_atom++;
        	}
	}
 
    	fclose(fichier);
    	return nb_atom;
}
 
void init_tab_pos(Position3D *tab_pos, int *tab_indice,char *nom_fichier){
	char ligne[81];	//on stockera chaque ligne tour a tour dans ce tableau
	char *deb_ligne; //debut de la ligne
	FILE* fichier;
	int i=0;
	deb_ligne=(char*)malloc(4*sizeof(char));
	fichier=fopen(nom_fichier,"r");
	printf("init_tab_\n");
	printf("sizeofligne:%d\n",sizeof(ligne));
 
	while(fgets(ligne,sizeof(ligne),fichier)!=NULL){ //tant qu'il reste des lignes a lire
		//printf("ligne:%s",ligne);
		if(strcmp(sous_chaine(deb_ligne,ligne,0,4),"ATOM")==0 || strcmp(sous_chaine(deb_ligne,ligne,0,6),"HETATM")==0){	//si le debut de la ligne est ATOM
            		tab_indice[atoi(sous_chaine(deb_ligne,ligne,7,11))]=i;
			tab_pos[i].x=atof(sous_chaine(deb_ligne,ligne,31,38));
			tab_pos[i].y=atof(sous_chaine(deb_ligne,ligne,39,47));
			tab_pos[i].z=atof(sous_chaine(deb_ligne,ligne,47,54));
			i++;
		}
	}
	printf("putain\n");
fclose(fichier); //C'est là que ça plante
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
printf("ça marche !\n");
}
 
void remplir_graphe(char* nom_fichier,int* tab_indice,char** graphe){
    char ligne[81];	//on stockera chaque ligne tour a tour dans ce tableau
	char *deb_ligne; //debut de la ligne
	//num_atom : numero de l'atome courant
    //atom_connect : numero de l'atome connect�a l'atome courant
	FILE* fichier;
	int j,deb,fin,num_atom,atom_connect;
	deb_ligne=(char*)malloc(6*sizeof(char));
 
    fichier=fopen(nom_fichier,"r");
 
    while(fgets(ligne,sizeof(ligne),fichier)!=NULL){ //tant qu'il reste des lignes a lire
		if(strcmp(sous_chaine(deb_ligne,ligne,0,6),"CONECT")==0){//si la ligne commence par "conect"
            deb=12; //position a laquelle on trouve les numeros d'atome connect�            fin=16;
            j=0;
            num_atom=atoi(sous_chaine(deb_ligne,ligne,7,11)); //numero de l'atome courant
            while(j<4 && atoi(sous_chaine(deb_ligne,ligne,deb,fin))){//tant qu'il y a des nombres sur la ligne connect et que leyr nombre est <4
              atom_connect=atoi(sous_chaine(deb_ligne,ligne,deb,fin));
              graphe[tab_indice[num_atom]][tab_indice[atom_connect]]=1;
              deb+=5;
              fin+=5;
              j++;
            }
        }
    }
    fclose(fichier);
}
 
void init_moins_un(int *tab,int nb_elem){
     int i;
     for(i=0;i<nb_elem;i++){
        tab[i]=-1;
     }
}
 
void init_graphe_zero(char **graphe, int nb_atome){
   int i,j;
   for(i=0;i<nb_atome;i++){
      for(j=0;j<nb_atome;j++){
         graphe[i][j]=0;
      }
   }
}
 
int lectPDB(char *nom_fichier,Position3D *tab_pos,char **graphe){
	int *tab_indice;
	int nb_atome;
 
 
    nb_atome=get_atom_pdb(nom_fichier);
	//printf("Nb d'atome du fichier %s : %d\n",nom_fichier,nb_atome);
 
    //allocation de la mémoire
    tab_indice=(int*)malloc(sizeof(int)*NB_MAX);
    //on initialise le tableau d'indice �-1
    init_moins_un(tab_indice,NB_MAX);
 
    //initialisation du tableau d'indice et du tableau de position
	init_tab_pos(tab_pos,tab_indice,nom_fichier);
	printf("Initialisation du tableau de position : OK\n");
 
   	//on initialise le graphe des conections a zero
	init_graphe_zero(graphe,NB_MAX);
	printf("Initialisation du graphe : OK\n"); 
 
    //on remplit le graphe des connection
    remplir_graphe(nom_fichier,tab_indice,graphe);
    printf("Remplissage du graphe : OK\n");
    return nb_atome;
}
Voilà le fichier ala.pdb :

HEADER AMINO ACID
COMPND ALANINE (ALA or A)
AUTHOR GENERATED BY GLACTONE
ATOM 1 N ALA 0001 -1.053 1.300 0.614
ATOM 2 CA ALA 0001 -0.304 0.032 0.746
ATOM 3 C ALA 0001 0.770 -0.014 -0.311
ATOM 4 O ALA 0001 1.952 -0.167 -0.047
ATOM 5 H ALA 0001 -1.805 1.385 1.386
ATOM 6 O ALA 0001 0.354 0.125 -1.567
ATOM 7 H ALA 0001 -1.522 1.368 -0.358
ATOM 8 H ALA 0001 0.176 0.013 1.740
ATOM 9 C ALA 0001 -1.237 -1.200 0.610
ATOM 10 H ALA 0001 -2.007 -1.183 1.397
ATOM 11 H ALA 0001 -0.655 -2.129 0.709
ATOM 12 H ALA 0001 -1.737 -1.199 -0.371
ATOM 13 H ALA 0001 1.100 0.082 -2.154
CONECT 1 2 5 7
CONECT 2 1 3 8 9
CONECT 3 2 4 4 6
CONECT 4 3 3
CONECT 5 1
CONECT 6 3 13
CONECT 7 1
CONECT 8 2
CONECT 9 2 10 11 12
CONECT 10 9
CONECT 11 9
CONECT 12 9
CONECT 13 6
END