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;
}
Configuration: Linux Red Hat
SeaMonkey 1.0.9

11 réponses

  1. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   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
  2. 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
  3. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   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
  4. Novartis
     
    Ca ne marche pas, j'ai toujours le même problème: "erreur de segmentation"
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437
     
    pourtant tout me parait correct...
    tu es sur que l'erreur vient du fscanf ?
    0
  7. 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
  8. 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
    1. 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
  9. 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
    1. 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
  10. Novartis
     
    Je n'ai pas tout compri pour le retour d'une fonction par rapport à N... :S

    Merci pour le truc^^
    0
    1. 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
  11. 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
  12. 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