Bonjour, j'ai un segmentation fault, et j'ai repéré la fonction qui ne va pas.
Pendant mon prgm, je calcule tout un tas de choses que j'écris ensuite dans un fichier "sorties.dat".
Chaque ligne de ce fichier contient N+2 colonnes (je connais la valeur de N)

L'idée de la fonction qui pose pb est qu'elle lit toutes ces sorties pour calculer ensuite la pression du moteur à chaque instant. Donc je parcours toutes les lignes, et à chaque ligne je calcule la pression puis je l'écris dans un autre fichier de sortie ("pressions.dat"), puis je passe à la ligne suivante.

voici ma fonction

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
 
void CalculPression(char * name_file,char * name_file_out,Engine * e,Species ** TabSpecies,double m,double R,unsigned int length)
{
    /* cette routine calcule la pression du systeme a l'instant t.
       
       name_file est un fichier qui contient les sorties a chaque instant.
       Chaque ligne de name_file est constitue du temps t, des fractions
       massiques de chaque espece et de la temperature
 
       name_file_out est le fichier de sortie dans lequel sera ecrite la pression en
       Pa
 
       e contient les caracteristiques du moteur
 
       TabSpecies contient toutes les donnees de chaque espece
 
       m est la masse du melange en g
       R est la constante des gaz parfaits en erg/(mol K)
 
       length est la longueur du vecteur y (donc length = nombre especes + 2)
     */
 
    /* ouverture du fichier d'ecriture de la pression */
    FILE * fileOutput = fopen(name_file_out, "w+");
 
    /* ouverture du fichier de sorties */
    FILE * file=fopen(name_file,"r");
    if (file==NULL)
    {
	fprintf(stderr,"Error in file %s line %d in function %s : file %s wasn't found\nExit program\n",__FILE__,__LINE__,__FUNCTION__,name_file);
	exit(1);
    }
 
    /* definition of a table of char intended to receive the line */
    char line[500];
 
    /* read of the first line of file name_file */
    fgets (line, sizeof line, file);
 
    printf("line = \n %s\n",line);
 
    char *p = strchr(line, '\n'); /* on cherche le caractere \n */
    if (p != NULL) /* s'il est trouve on l'elimine */
	*p = 0;
 
    int j=1;
    while(fgets (line, sizeof line, file) != NULL)
    {
 
	printf("j = %d\n",j);
	++j;
 
	p = strchr(line, '\n'); /* on cherche le caractère \n */
	if (p != NULL) /* s'il est trouvé on l'elimine*/
	    *p = 0;	
 
 
	int i;
	double volume,dvolume_dt,y,t,T;
	fscanf(file,"%lf",&t); /* on recupere le temps */
	V_Vp(t,e,&volume,&dvolume_dt);
 
	printf("t = %f\n",t);
 
	/* calcul de la masse molaire du melange M en g/mol */
	double M=0.0;
	for(i=0;i<length-2;++i)
	{
	    /* on recupere la fraction massique de l'espece */
	    fscanf(file,"%lf",&y);
 
	    M+=y/TabSpecies[i]->M;
	    printf("i = %d\ty = %f\tM = %f\n",i,y,M);
	}
 
     //ici j'ai mon segmentation fault donc toto ne s'affiche pas a l'ecran
 
    printf("toto\n");
 
	M=1.0/M;
 
	printf("tata\n");
	fscanf(file,"%lf",&T); /* on recupere la temperature */
 
	/* calcul de la pression en Pa (d'ou le coefficient 0.1) */
	const double pression=m/volume*R/M*T*0.1;
 
	/* on ecrit dans le fichier name_file_out la pression */
	fprintf(file,"%g\n",pression);
 
    } /* fin du while */
 
    if (feof(file)) /* end of file was detected */
    {
	fprintf(stderr,"Error in file %s line %d function %s \n:Exit program\n",__FILE__,__LINE__,__FUNCTION__);
	exit(1);
    }
 
    if (ferror(file)) /* an error occurred */
	fprintf(stderr,"Error in file %s line %d function %s : a misreading occurred\nExit program\n",__FILE__,__LINE__,__FUNCTION__);
 
    /* on ferme les fichiers */
    fclose(fileOutput);
    fclose(file);
 
    return;
}
l'erreur se trouve à la sortie de la boucle for(i=0;blabla). A la sortie j'ai un segmentation fault si bien que toto ne s'affiche pas à l'écran.

1) Savez-vous pourquoi s'il vous plait ?
2) j'ai écrit un moment char line[500]. Mais je ne connais pas la longueur de la ligne. J'espère que 500 caractères suffisent mais exite-t-il une autre manière pour être sûr d'avoir tous les caractères de la ligne ?
3) la petite cerise sur le gâteau : j'aimerais bien rajouter la colonne de la pression à la suite des autres colonnes de mon fichier "sorties.dat" (histoire de n'avoir qu'un seul fichier de sortie et non deux). Comment faire ?
Pour cette question, j'avoue ne pas m'y être encore penché. je pense que ce doit être une question d'option r ou r+ ou w ou w+ dans mon fopen.

Merci d'avance.