C fscanf qui ne lit pas toutes les données

Novartis -  
 Novartis -
Bonjour,

J'ai un souci j'ai un fichier à lire celui-ci est une matrice de donné de 4210*210, (où la première donnée ne m'intéresse pas pour chaque individu, c'est pour ça que je l'enlève) que je stock dans un fichier fpfpd. Il s'avère que quand je veux exécuter ce script mon compilateur m'annonce que j'ai une erreur de segmentation, ceci certainement dû (quasiment sûr) au fscanf qui ne veut pas lire pour 4210 (ligne) mais veut bien pour 327 (j'ai essayé c'est le maximum).

J'ai vu qu'il 'avait déjà des soucis avec ce gnere de problème et j'ai vu qu'on parlait de "malloc", étant un jeune étudiant est pas vraiment expérimenté sur C, il y'a pas mal de choses que je ne comprends pas en C, donc pouvez-vous m'aider pour mon problème., me donner une solution avec le malloc ou non si y'a pas besoin...

Merci d'avance, je vous donne le script que j'ai tapé:

#include<stdio.h>
#include<math.h>

void floersheim(int N,int P){

int a=0;
int b=0;
int i=0;
int j=0;

FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
fscanf(file,"%lf",&temp);
for(j=0;j<P;j++){
fscanf(file,"%lf\tab",&tab[i][j]);
printf("%lf ",tab[i][j]);
}
}
fclose(file);
}

int main(void){
floersheim(4210,210);
return 0;
}
A voir également:

11 réponses

mype Messages postés 2449 Statut Membre 437
 
ça segfault parce que tu essayes de stocké quelquechose dans deux variable temp et tab que tu n'as pas déclaré
il faut que tu les declares selon leur type...
0
Novartis
 
Oups! pardon!

J'ai voulu faire du copier/coller pour mettre ce qui peut vous intéresser et dans le coup j'ai oublier de mettre justement ça:
double temp;
double tab[N][P];

Donc pour réponse oui en fait je les ai déclaré donc le problème n'est pas résolu...
0
mype Messages postés 2449 Statut Membre 437
 
essaye en faisant
for(j=0;j<P-1;j++){
fscanf(file,"%lf",&tab[i][j]);
printf("%lf ",tab[i][j]);
}  
comme tu enleves la premiere valeur
0
Novartis
 
Ca ne marche pas, j'ai toujours le même problème: "erreur de segmentation"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mype Messages postés 2449 Statut Membre 437
 
pourtant tout me parait correct...
tu es sur que l'erreur vient du fscanf ?
0
Novartis
 
#include<stdio.h>
#include<math.h>

void floersheim(int N,int P){

int a=0;
int b=0;
int i=0;
int j=0;
double temp;
double SB[N];
double SA[N];
double tab[N][P];
double No[N][N];
double Dc[N][N];
double VA[N][N][P];
double Den[N][N][P];
double SAB[N][N];

FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
fscanf(file,"%lf",&temp);
for(j=0;j<P-1;j++){
fscanf(file,"%lf\tab",&tab[i][j]);
printf("%lf ",tab[i][j]);
}
}
fclose(file);

FILE * f = fopen("/home/varin/Molecules/JC/Md61.R", "w");
for(a=0;a<N;a=a+1){
printf("%d\n",a);
for(b=0;b<N;b=b+1){
for(j=0;j<P;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);
fprintf(f,"%lf ",Dc[a][b]);
//printf("%lf\n",Dc[a][b]);
}
fprintf(f,"\n");
}
fclose(f);

}

int main(void){
floersheim(280,210);
return 0;
}

Voilà j'ai mis tout mon code... Effectivement peut-être ça ne vient pas du fscanf mais du fprintf...?!
0
Novartis
 
Alors j'ai vérifié, ce n'est pas le fscanf ou le fprintf ou je ne sais quoi qui bloque en fait c'est dans ma boucle de calcul que ça bloque:

for(a=0;a<N;a=a+1){
printf("%d\n",a);
for(b=0;b<N;b=b+1){
for(j=0;j<P;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);


Donc je re Up! Pour de l'aide s'il vous plait..!

Merci d'avance.
0
Tisiph0n3 Messages postés 21 Statut Membre
 
Tu as oublié de mettre le code complet et de te servir de la balise code, c'est illisible :/
Refais ça bien si tu veux de l'aide
0
Novartis
 
#include<stdio.h>
#include<math.h>


void floersheim(int N,int P){

	int a=0;
	int b=0;
	int i=0;
	int j=0;
	double temp;
	double SB[N];
	double SA[N];
	double tab[N][P-1];
	double No[N][N];
	double Dc[N][N];
	double VA[N][N][P];
	double Den[N][N][P];
	double SAB[N][N];

	FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
	for(i=0;i<N;i++){
		printf("%d\n",i);
	        fscanf(file,"%lf",&temp);
	        for(j=0;j<P-1;j++){
		        fscanf(file,"%lf\tab",&tab[i][j]);
			//printf("%lf ",tab[i][j]);
		}		 
	}
	fclose(file);
	
	FILE * f = fopen("/home/varin/Molecules/JC/Md61.R", "w");
	for(a=0;a<N;a=a+1){ 
	        //printf("%d\n",a);
		for(b=0;b<N;b=b+1){
			for(j=0;j<P-1;j=j+1){
				SA[a]=SA[a] + tab[a][j];
				SB[b]=SB[b] + tab[b][j];
				SAB[a][b]=SA[a]+SB[b];
				VA[a][b][j]=(tab[a][j]-tab[b][j]);
				if(VA[a][b][j]<0)
					VA[a][b][j]=-VA[a][b][j];
				else
					VA[a][b][j]=VA[a][b][j];
				if(tab[a][j]<=tab[b][j])
					Den[a][b][j]=(1+tab[a][j]);
				else
					Den[a][b][j]=(1+tab[b][j]);
				No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
			}
			Dc[a][b]=(No[a][b]/SAB[a][b]);
			fprintf(f,"%lf ",Dc[a][b]);
			//printf("%lf\n",Dc[a][b]);
 		}
	fprintf(f,"\n");
	}
	fclose(f);
	
}


int main(void){
  floersheim(2801,211);
  return 0;
}


Donc où il'a le problème c'est ici:

for(a=0;a<N;a=a+1){ 
		for(b=0;b<N;b=b+1){
			for(j=0;j<P-1;j=j+1){
				SA[a]=SA[a] + tab[a][j];
				SB[b]=SB[b] + tab[b][j];
				SAB[a][b]=SA[a]+SB[b];
				VA[a][b][j]=(tab[a][j]-tab[b][j]);
				if(VA[a][b][j]<0)
					VA[a][b][j]=-VA[a][b][j];
				else
					VA[a][b][j]=VA[a][b][j];
				if(tab[a][j]<=tab[b][j])
					Den[a][b][j]=(1+tab[a][j]);
				else
					Den[a][b][j]=(1+tab[b][j]);
				No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
			}
			Dc[a][b]=(No[a][b]/SAB[a][b]);
}
0
Tisiph0n3 Messages postés 21 Statut Membre
 
for(a=0;a<N;a=a+1){ 
		for(b=0;b<N;b=b+1){
			for(j=0;j<P-1;j=j+1){

pourtant les boucles sont correctes, peut etre que N est mal initialisé, où que si ce N est le retour d'une fonction cette fonction soit foireuse moi je regarderais de ce coté là.
juste un truc, tu peux faire a++; au lieu de a=a+1 ou encore a += 1
0
Novartis
 
Je n'ai pas tout compri pour le retour d'une fonction par rapport à N... :S

Merci pour le truc^^
0
Tisiph0n3 Messages postés 21 Statut Membre
 
Ben en gros si tu recodes str_len et que tu te plantes, et que ton str_len te retourne invariablement la longueur de la chaine + 1, si tu as un code style:
int      len;

len = str_len_froireux(str);
for(i = 0, i < len, i++)
   write(1, &str[i], 1);


Ben là il ya de grandes chances que ça segfault vu que le retour de str_len_foireux est foireux justement, dans le cas qui nous interesse ton compteur n'atteint jamais N a mon avis du fait que soit N est le retour d'une fonction qui merde, ou bien N est negatif et vu que ton compteur est certainnement initialisé a 0 et que tu l'incrémentes, ben ya peu de chance que ce compteur soit un jour égal a N, ou alors il sera tombé dans un trou spatio-temporel, mais là c'est une autre histoire.
Ou bien encore N est égal a 42, et là on peut rien faire :D
0
Novartis
 
Moué... J'ai pas tout saisi...

Enfin bon c'est pas grave je peux me passer de ce code en C mais il est vrai que j'aurai aimé pouvoir l'utiliser...

En tout cas merci à tous ceux qui m'ont aidé et si il y'a d'autres suggestions d'explication je suis preneur!
0
Novartis
 
Voilà mon code final, il marche très bien!

Le problème venait de la lecture dans le fscanf, la retranscription se faisait en chaine de caractère et non en nombre. Donc je fais une lecture d'une chaine de caractère que j'ai déclaré en tant que tel et j'ai utiliser atof pour que cette chaine de caractère devienne un nombre à virgule.!

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

void floersheim(int N,int P){

	int a=0;
	int b=0;
	int i=0;
	int j=0;
	char temp;
	char *str;
	float tab[N][P-1];
	float num;
	float denom;
	float Dc[N][N];

	FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
	for(i=0;i<N;i++){
		printf("%d\n",a);
	        fscanf(file,"%s",&temp);
	        for(j=0;j<P-1;j++){
			str=malloc(100);
		        fscanf(file,"%s",str);
			//printf("%s ",str);
			tab[i][j]=atof(str);
		}		 
	}
	fclose(file);
	
	printf("calculs\n");
	
	FILE * f = fopen("/home/varin/Molecules/JC/Md61", "w");
	for(a=0;a<N;a++){ 
	        printf("%d\n",a);
		for(b=0;b<N;b++){
			num = 0;
			denom = 0;
			for(j=0;j<P-1;j++){
				denom += tab[a][j] + tab[b][j];
				num += (abs(tab[a][j]-tab[b][j]))/(1 + ((tab[a][j] + tab[b][j]) - abs(tab[a][j]-tab[b][j])) / 2);
			}
			Dc[a][b]=(num / denom);
			fprintf(f,"%f ",Dc[a][b]);			
			//printf("%f\n",Dc[a][b]);
 		}
	fprintf(f,"\n");
	}
	fclose(f);
	
}


int main(void){
  floersheim(2801,211);
  return 0;
}
0