Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

J'ai un problème avec un segmentation fault



  1. #1
    gatsu

    J'ai un problème avec un segmentation fault


    ------

    Bonjour,

    Voilà j'ai écris un petit programme en langage C, un peu bourrin peut être, (car je ne suis pas informaticien de base) dont le but est de calculer des integrales doubles d'une fonction (de façon élémentaire). En sachant que je ne connait que les valeurs de la fonction en certains points mais pas la forme analytique de la fonction. Apparemment ça compile sans problème et au moment d'executer il y a un bug (segmentation fault) et je ne vois pas o`u il se trouve. J'ai bien essayé de regarder si je ne dépassais pas les limites du tableau mais je ne crois pas et donc je suis un peu perdu
    Est ce qu'une âme charitable pourrait m'aider svp !

    Merci d'avance pour vos réponses

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



    main(){

    FILE *fp,*fs,*fl;
    fp=fopen("energie.txt","r");
    fs=fopen("SEIcylindre_sphere.t xt","w");
    fl=fopen("test.txt","w");

    float domaine=40.,*E,dx=0.05,x,y,a_1 =10.,a_2=10.,D,dy=0.05,I_1=0., I_2=0.,I_3=0.,I_4=0.,I;
    int i,j,k,l,N;
    N=(int)(domaine/dx);
    E=(float *)malloc(N*sizeof(float));
    for(i=0;i<N;i++){
    E[i]=0.;
    }
    i=0.;
    while((j=fgetc(fp))!=EOF){
    fscanf(fp,"%f",&E[i]);
    i++;
    }
    /* for(i=0;i<N;i++){
    fprintf(fl,"%f\n", E[i]);
    }*/
    /*jusqu'ici OK*/

    for(D=0.05;D<20;D+=0.1){
    for(x=0;x<a_1;x+=dx){
    for(y=0;y<sqrt(a_1*a_1-y*y);y+=dy){

    i=(int)((D+a_2+a_1+a_2*sqrt(1-(y/a_2)*(y/a_2))+a_1*sqrt(1-(y/a_1)*(y/a_1)-(x/a_1)*(x/a_1)))/dx);
    j=(int)((D+a_2+a_1-a_2*sqrt(1-(y/a_2)*(y/a_2))-a_1*sqrt(1-(y/a_1)*(y/a_1)-(x/a_1)*(x/a_1)))/dx);
    k=(int)((D+a_2+a_1+a_2*sqrt(1-(y/a_2)*(y/a_2))-a_1*sqrt(1-(y/a_1)*(y/a_1)-(x/a_1)*(x/a_1)))/dx);
    l=(int)((D+a_2+a_1-a_2*sqrt(1-(y/a_2)*(y/a_2))+a_1*sqrt(1-(y/a_1)*(y/a_1)-(x/a_1)*(x/a_1)))/dx);


    I_1+=sqrt(1-(y/a_2)*(y/a_2))*E[i]*dx*dy;
    I_2+=sqrt(1-(y/a_2)*(y/a_2))*E[j]*dx*dy;
    I_3+=sqrt(1-(y/a_2)*(y/a_2))*E[k]*dx*dy;
    I_4+=sqrt(1-(y/a_2)*(y/a_2))*E[l]*dx*dy;

    fprintf(fl,"%d\t%d\t%d\t%d\t%f \t%f\t%f\t%f\t%f\t%f\n", i,j,k,l,I_1,I_2,I_3,I_4,x,y);
    }
    }

    I=4*(I_1+I_2-I_3-I_4);

    fprintf(fs,"%f\t%f\n", D,I);
    I_1=0.,I_2=0.,I_3=0.,I_4=0.;
    }

    free(E),fclose(fs),fclose(fp);
    }

    -----
    Dernière modification par gatsu ; 29/01/2007 à 11h36. Motif: j'avais oublié un détail

  2. Publicité
  3. #2
    Coincoin

    Re : J'ai un problème avec un segmentation fault

    Salut,
    Essaye de mettre des "printf("toto\n");" régulièrement pour voir où ça plante.
    Et vérifie bien tes allocations et désallocations de mémoire.

    J'ai bien essayé de regarder si je ne dépassais pas les limites du tableau mais je ne crois pas
    Vérifie ! Fais afficher l'indice avant d'appeler le tableau.
    Encore une victoire de Canard !

  4. #3
    Konrad

    Re : J'ai un problème avec un segmentation fault

    Effectivement Segmentation fault ça m'arrive régulièrement (car je ne suis aps informaticien de formation non plus, et assez étourdi), et il y a 90% de chances que ça vienne d'un dépassement de tableau. Vérifie et revérifie de ce côté là !
    "Un clavier AZERTY en vaut deux."

  5. #4
    Coincoin

    Re : J'ai un problème avec un segmentation fault

    Et 9,9% de chance que ça vienne du malloc ou du free...
    Encore une victoire de Canard !

  6. A voir en vidéo sur Futura
  7. #5
    erik

    Re : J'ai un problème avec un segmentation fault

    Tu pourrais commencer par rajouter des
    if (fp == NULL)
    {
    fprintf(stderr, "Cannot open input file.\n");
    return 1;
    }
    Pour être sur que tes fichiers sont bien ouverts.

    Ensuite il me semble vaguement que getc et scanf ne font pas bon ménage (mais c'est des souvenirs flous),
    le probleme est peut être dans la boucle
    while((j=fgetc(fp))!=EOF){
    fscanf(fp,"%f",&E[i]);
    i++;
    }
    D'ailleurs je ne comprend pas bien ce que va faire cette boucle. Dans la condition tu fais une lecture caractère par caractère de ton fichier, et à chaque fois que tu a un caractères tu lis un flottant ??
    Si le fichier contient
    3.1415
    1.1234
    tu vas boucler 12 fois mais il n'y a que deux float à lire.

    peut être que c'est normal (je ne sais pas ce que contient energie.txt)
    Des milliards de personnes disent que j'exagère. Même pas vrai !

  8. #6
    invite79115743

    Re : J'ai un problème avec un segmentation fault

    D'autant plus qu'il n'y a aucune vérification sur la taille du fichier, si le nombre de caracteres à lire est supérieur à la taille du tableau c'est déja le segfault et c'est probablement ici que vient ton probleme car tu sembles confondre caractere et flottant.
    Si ton fichier contient autant de flottants que le tableau peut en contenir il va segfault.
    Some of those tha wear forces, are the same that burn crosses.

  9. Publicité
  10. #7
    erik

    Re : J'ai un problème avec un segmentation fault

    mes souvenirs sur getc et scanf se précisent un peu.
    pense au fait que ton fichier contient des caractères "retour à la ligne" et ça potentiellement ça peut gener : si tu en a un à la fin du fichier, getc va le lire (donc pas de EOF) et scanf va lire un float de trop.

    Essaye
    while(fscanf(fp,"%f",&E[i++])!=EOF);

    Enfin bref ne mélange pas getc et scanf, et fait plus de test (la taille ne dépasse pas telle valeur, mon pointeur n'est pas nul ....) dans ton programme c'est chiant à écrire sur le moment, mais quand il y'a un bug on le trouve 100 fois plus vite, c'est une habitude indispensable à prendre.
    Des milliards de personnes disent que j'exagère. Même pas vrai !

  11. #8
    gatsu

    Re : J'ai un problème avec un segmentation fault

    Bonjour,

    Merci à tous pour vos réponses ! J'aurais appris plein de choses que j'espere je ne ferai plus.
    En fait, apparemment, le segfault venait d'une faute de frappe qui impliquait une inégalité auto consistante :
    y<sqrt(a²-y²)
    dans l'intégrale double et ça a donc pu créer des problèmes .
    En ce qui concerne le
    while((j=getc(fp))!=EOF)...sca nf("%f",&x)
    je l'avais trouvé dans un cours sur internet. D'après ce que vous dites ça ne devrait pas marcher (et je vous crois !!) mais pour le coup je dois avoir du bol parce que ça a l'air de bien faire ce que je veux
    En tout cas j'utiliserais dorenavant les methodes que vous m'avez conseillé, merci !

Discussions similaires

  1. j'ai un problème avec les Séismes!!!
    Par djydji dans le forum Géologie et Catastrophes naturelles
    Réponses: 1
    Dernier message: 23/11/2007, 06h33
  2. j'ai un problème avec ce VCO
    Par obi1bi dans le forum Électronique
    Réponses: 0
    Dernier message: 12/11/2007, 13h32
  3. j'ai un problème avec ma machine à laver
    Par poireau dans le forum Dépannage
    Réponses: 6
    Dernier message: 18/12/2006, 12h55
  4. j'ai un problème avec ma centrale vapeur
    Par victorm dans le forum Dépannage
    Réponses: 1
    Dernier message: 03/08/2006, 12h16
  5. j'ai un probleme avec win 98 sys.ini
    Par SuzieQ71 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 16/01/2005, 18h25
Découvrez nos comparatifs produits sur l'informatique et les technologies.