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 :
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
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");
Voilà le fichier ala.pdb :
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; }
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
Partager