Bonjour, comme le dit le titre du message, je n'arrive pas à me débarrasser de mon warning et d'un segmentation fault. Pourtant le prgm tourne, il me renvoie la bonne valeur, mais tout à la fin j'ai un segmentation fault. J'ai réussi à trouver la ligne de l'erreur.
Mon prgm est assez simple : il lit un fichier donnees.txt et charge les valeurs dans un tableau. Je vous envoie mon fichier donnees.txt

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
CH3
12.5 1000.2
12.3 45.2 10.2 45.3 63.22 78 45.1
45.0 56.3 78.98 56.32 478.63 56.32 896.3
 
CH2
23.2 56.1
121.2 56.3 25.2 12 63.3 56.3 4102.3
45.3 65.3 23.3 652.69 78.2 56.3 56.98
et mon main

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
 
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
 
typedef struct {
    char * name; /* name */
    double M;    /* molar mass */
    double Ts;   /* critical temperature */
    double * BT; /* 7 low temperature coefficients */
    double * HT; /* 7 high temperature coefficients */
} Species_;
 
typedef Species_ * Species;
typedef Species * pSpecies;
 
Species CreateSpecies(char * n,double M_,double Ts_,double * BT_,double * HT_)
{
    Species s=malloc(sizeof(Species_));
    s->name=n;
    s->M=M_;
    s->Ts=Ts_;
    int i;
    s->BT=malloc(7*sizeof(double));
    s->HT=malloc(7*sizeof(double));
    for(i=0;i<7;++i)
    {
	s->BT[i]=BT_[i];
	s->HT[i]=HT_[i];
    }
    return s;
}
 
Species CreateEmptySpecies(void)
{
    Species s=malloc(sizeof(Species_));
    s->name="no name";
    s->M=0.0;
    s->Ts=0.0;
    s->BT=malloc(7*sizeof(double));
    s->HT=malloc(7*sizeof(double));
    int i;
    for(i=0;i<7;++i)
	s->BT[i]=s->HT[i]=0.0;
 
    return s;
}
 
void PrintSpecies(Species s)
{
    if(s->M==0.0)
	printf("Empty Species\n");
    else
    {
	printf("%s\n",s->name);
	printf("%f\t%f\n",s->M,s->Ts);
	int i;
	for(i=0;i<7;++i)
	    printf("%f\t",s->BT[i]);
	printf("\n");
	for(i=0;i<7;++i)
	    printf("%f\t",s->HT[i]);
	printf("\n");
    }
    return;
}
 
void DestroySpecies(pSpecies s)
{
    free((*s)->BT);
    free((*s)->HT);
    free(*s);
    return;
}
 
void LoadSpecies(char * name_file,char *name_species,double *M,double *T,double * t1,double * t2);
 
int main()
{
 
    char * name_file="donnees.txt";
    double M,T;
 
    double * t1=malloc(7*sizeof(double));
    double * t2=malloc(7*sizeof(double));
 
char * Name[]={"CH3","CH2","CH3"};
    printf("%s\t%s\t%s\n",Name[0],Name[1],Name[2]);
 
    Species tab=malloc(3*sizeof(Species_));
    int i;
    for(i=0;i<3;++i)
    {
	LoadSpecies(name_file,Name[i],&M,&T,t1,t2);
 
	tab[i]=*CreateEmptySpecies();
	tab[i].name=Name[i];
 
	LoadSpecies(name_file,Name[i],&tab[i].M,&tab[i].Ts,tab[i].BT,tab[i].HT);
 
	printf("affichage de tab[%d]\n",i);
	PrintSpecies(&tab[i]);
    }
 
    //free(t1); free(t2);
 
    for(i=0;i<3;++i)
	DestroySpecies(&tab[i]);
 
    free(tab);
 
    return 0;
}
 
void LoadSpecies(char * name_file,char *name_species,double *M,double *T,double * t1,double * t2)
{
    FILE * file=fopen(name_file,"r");
    if (file==NULL)
    {
	printf("Error in function LoadSpecies : file %s unfounded\nExit program\n",name_file);
	exit(1);
    }
 
    /* definition d'un tableau de char destine a recevoir la ligne */
    char line[150];
 
    /* definition d'un compteur de lignes et initialisation */
    int cpt = 1;
 
    /* lecture de la premiere ligne du fichier name_file */
    fgets (line, sizeof line, file);
 
    char *p = strchr(line, '\n'); /* cherche le '\n' */
    if (p != NULL) /* si on l'a trouve, on l'elimine. */
	*p = 0;
 
 
    int d=strcmp(line,name_species);
 
 
    while( d && (fgets (line, sizeof line, file) != NULL) )
    {
	++cpt; /* Mise a jour du compteur de lignes */
 
	p = strchr(line, '\n'); /* cherche le '\n' */
	if (p != NULL) /* si on l'a trouve, on l'elimine. */
	    *p = 0;
 
	d=strcmp(line,name_species);
    }
 
    if (feof(file)) /* la fin de fichier a ete detectee */
    {
	printf("Error in function LoadSpecies : species %s unfounded\nExit program\n",name_species);
	//puts("Espece introuvable\nArret du programme\n");
	exit(1);
    }
 
    /* on charge l'espece */
 
    fscanf(file,"%lf%lf",M,T);
 
    int i;
 
    for(i=0;i<7;++i)
	fscanf(file,"%lf",&t1[i]);
 
    for(i=0;i<7;++i)
	fscanf(file,"%lf",&t2[i]);
 
    fclose(file);
 
    return;
}
Ma sortie est correct (affichage à l'écran des bonnes valeurs). Voici ce que j'obtiens :

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
 
main.c:137: attention : passage de l'argument n°1 de « DestroySpecies » d'un type pointeur incompatible
CH3     CH2     CH3
affichage de tab[0]
CH3
12.500000       1000.200000
12.300000       45.200000       10.200000       45.300000       63.220000       78.000000       45.100000
45.000000       56.300000       78.980000       56.320000       478.630000      56.320000       896.300000
affichage de tab[1]
CH2
23.200000       56.100000
121.200000      56.300000       25.200000       12.000000       63.300000       56.300000       4102.300000
45.300000       65.300000       23.300000       652.690000      78.200000       56.300000       56.980000
affichage de tab[2]
CH3
12.500000       1000.200000
12.300000       45.200000       10.200000       45.300000       63.220000       78.000000       45.100000
45.000000       56.300000       78.980000       56.320000       478.630000      56.320000       896.300000
Erreur de segmentation
Mon erreur vient du tableau tab mais je n'arrive pas à la corriger. Pouvez-vous m'aider ?
Excusez-moi encore de cette longue lecture.
Merci.