IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Problème de segmentation


Sujet :

Fortran

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 40
    Par défaut Problème de segmentation
    Bonjour à tous,

    Je suis en stage et je dois donc coder en Fortran
    Je travaille sur un gros projet. Je dois modifier un programme d'environ 1000 lignes.
    Cependant, lors de l'exécution, mon problème se déroule correctement jusqu'à la fin du programme où il fini par me prévenir d'une erreur de segmentation
    Je travaille avec des tableaux. Cela vient peut-être de là.
    En tout cas, cela fait déjà 3 jours que je tourne en rond...
    Auriez-vous une idée d'où cette erreur peut-elle provenir?
    Merci d'avance d'avoir pris le temps de me lire

  2. #2
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Sans voir le code s'est difficile. Si tu compiles avec ifort tu peux essayer de mettre les options suivantes qui te donneront plus d'indications sur l'endroit où ça coince :

    ifort -g -traceback -check bounds (-check uninit -warn unused)

    tu n'est pas obligé de mettre les deux dernières.

    le -g et le traceback permettent d'inclure dans l'exécutable des informations utiles pour deboguer (nom des variables, valeurs des variables sous formes décimales ...) le - check bounds controle que tu ne dépasses pas la taille de tes tableaux.

    Bon courage

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 40
    Par défaut
    Je suis sur Linux, donc ifort il ne connait pas. En revanche, j'ai vu qu'au lieu de ifort on peut utiliser gfortran pour débugger. Mais je n'ai pas trouvé les options correspondantes malheureusement. Est-ce que quelqu'un se serait déjà servi de gfortran?

  4. #4
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Le fait que tu sois sous linux n'a pas de rapport avec ifort, je suis moi aussi sous linux

    ifort est le compilateur fortran de intel : intel fortran = ifort

    gfortran est un autre compilateur (ce n'est pas pour degoguer). Tu peux utiliser l'un ou l'autre, je ne saurais pas te dire si l'un des deux est mieux. Celui a peut être plus d'option d'optimisation ... je suis pas expert la dessus.

    Pour les options, dans ton terminal tu fais man gfortran.

    ça c'est à la place de -check bounds de ifort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          -fbounds-check
               Enable generation of run-time checks for array subscripts and against the
               declared minimum and maximum values.  It also checks array indices for
               assumed and deferred shape arrays against the actual allocated bounds.
     
               In the future this may also include other forms of checking, eg. checking
               substring references.
    La pluspart des options sont communes à gfortran et gcc (compilateur C) donc regarde aussi man gcc.

    Le -g tu peux le laisser

    Après les options -Wxxxxxxxxxxxx permettent de faire des controles, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           -Wundef
               Warn if an undefined identifier is evaluated in an #if directive.

    essaye déjà de compiler avec "gfortran -g -fbounds-check" pour voir si tu as plus d'infos qu'un brutal "segmentation fault"

  5. #5
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    si tu as des tableau dynamique tu recevra une 'erreur de segmentation' (i.e. dépassement mémoire) au moment de la désallocation (donc souvent à la fin d'une exécution) si tu as dépassé les bornes d'indices du tableau!!!

    il faut donc que tu piste tes tableaux et vérifier que tu n'écris pas dans une zone de tableau qui n'est pas censé exister... mais bon dans un petit code de 1000ligne cela dois être assez rapide!

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 40
    Par défaut
    J'ai exécuté la ligne de commande suivante :

    gfortran -Wall -g -fbounds-check

    J'obtiens une erreur du type :

    make: *** Erreur 1

    Sans aucunes autres explications.
    J'ai essayé de regarder sur internet et j'ai trouvé que cette erreur correspond à une erreur générale s'il n'y a pas d'autres erreurs explicites connues. Cela ne m'avance donc pas vraiment.

    Je vais essayer de regarder où est ce que mon programme écrit dans mon tableau mais comme je début en fortran, ce n'est pas dit que ce soit facil

  7. #7
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Euh

    Désolé pour la question idiote mais as tu bien mis ton programme ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gfortran -Wall -g -fbounds-check mon_programme.f90
    Sinon pourquoi tu parles de make ? Tu utilises un Makefile ?

  8. #8
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    si tu as des tableaux dynamiques, fbounds-check ne te sera d'aucuns secours!

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Citation Envoyé par genteur slayer Voir le message
    si tu as des tableaux dynamiques, fbounds-check ne te sera d'aucuns secours!
    Pas du tout; cette option teste si il y a un dépassement de tableau en cours d'exécution, donc connaissant la taille des tableaux alloués en amont.

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 40
    Par défaut
    Ma question va peut-être vous paraître stupide, mais où est l'intéret d'allouer de la mémoire pour un tableau? Certains tuto parlent d'utiliser "allocate" pour les tableaux mais je ne vois pas pourquoi. Pourriez-vous m'éclairer?

  11. #11
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    la commande allocate est justement la fonction qui va reserver la mémoire pour ton tableau...

    grossomodo...

    tu peux faire une truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    !je déclare un tableau dynamique à trois dim:
    real(kind=8),dimension(:,:,:),allocatable :: TABLEAU
    ! j'ai une routine qui calcul la taille du tableu....
    call TAILLE_TAB(NN,NM,NO)
    !je réserve la mémoire:
    allocate(TABLEAU(NN,NM,NO))
    !cool, j'ai un tableau d'indices compris entre:
    ! (1..NN,1..NM,1..NO)
    ......
    ! toujours penser à désalouer:
    DEALLOCATE(TABLEAU)
    bien évidement, on peut allouer-utiliser-désallouer dans des routines différente...

    P.S.
    et chez moi, -fbounds-check n'a jamais marché avec les tableaux dynamique (qui sont des pointeurs déguisés en fait), en revanche les tableau de taille statique ça marche bien (à l'exec il te donne tes dépassement...)

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/11/2007, 18h44
  2. Problème java segmentation
    Par irdaa dans le forum Mandriva / Mageia
    Réponses: 1
    Dernier message: 28/03/2007, 08h24
  3. [Socket SSL] problème de "Segmentation fault"
    Par jesus144 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 09/03/2007, 19h50
  4. Problème de segmentation.
    Par Gryzzly dans le forum C
    Réponses: 12
    Dernier message: 27/12/2005, 11h02
  5. Problème de segmentation ?
    Par julson dans le forum Assembleur
    Réponses: 2
    Dernier message: 23/12/2004, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo