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 :

segfault étrange en fortran


Sujet :

Fortran

  1. #1
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut segfault étrange en fortran
    Bonjour le forum,
    en fortran, j'ai une "segmentation fault" que je n'arrive pas à comprendre :
    Celà se passe lors d'un opération de lecture, dans une ligne qui contient du texte ascii (provenant d'un fichier d'entrée) :

    Voici l'instruction qui plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          read(line, *, err=804, end=805)
         +EIDrpt(IDrpt), SClu, Srpt(DIR, IDrpt, K, Z)
    Quand je remplace la variable qui fait planter la lecture, Srpt(... ), par un réel temporaire que j'appelle Stmp, ça marche, et cette variable est correctement remplie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          read(line, *, err=804, end=805)
         +EIDrpt(IDrpt), SClu, Stmp
    Par contre quand j'essaye d'affecter cette valeur, qui a été correctement lue et placée dans le réel temporaire, vers la variable dans laquelle j'aurais voulu l'affecter dès la première opération, hébin ça plante à nouveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          Srpt(DIR, IDrpt, K, Z)=Stmp (BOUM !)
    Ce qui me fait penser que ce sont les indices de ce tableau qui ne sont pas bons.
    Donc évidemment j'ai vérifié la dimension du tableau que j'essaye de remplir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          real Srpt(0:3, MAXelt, 6, 2) ! S(DIR, IDrpt, K, Z)
    -avec une définition préalable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          PARAMETER (MAXelt=11000)

    Et j'ai vérifié aussi les valeurs des indices au moment de la tentative de lecture :
    -DIR vaut 1,
    -IDrpt vaut 1,
    -K vaut 1,
    -Z vaut 1.
    Ils sont tous à 1 puisque c'est la première tentative d'écriture dans ce tableau.

    Que cela vous inspire t'il; pouvez vous m'aider ?
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    De mon expérience, je dirais que la mémoire est corrompue par un débordement ou par un appel de fonction/routine avec le mauvais nombre ou type de paramètres. Tu dois donc commencer par activer toutes les switches de vérification du compilateur.

    Si tu as accès à un débogueur symbolique, tu peux vérifier l'adresse de la variable au début de l'exécution, et juste avant la lecture. L'adresse devrait avoir changée. Tu peux ensuite essayer de trouver quand elle change par une exécution pas à pas.

  3. #3
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Bonjour,
    bon, alors il se trouve que la machine que j'utilise est une red-hat qui a 32 proc's sous linux, donc j'utilise gfortran, et les switches de vérification à la compilation sont :

    Warning Options
    -fsyntax-only -pedantic -pedantic-errors -w -Wall -Waliasing -Wampersand -Wconversion -Wimplicit-interface -Wnonstd-intrinsics -Wsurprising -Wunderflow -Wunused-labels -Wline-truncation -W

    -w Inhibit all warning messages.

    -Wall
    Enables commonly used warning options pertaining to usage that we recommend avoiding and that we believe are easy to avoid. This currently includes
    -Wunused-labels, -Waliasing, -Wampersand, -Wsurprising, -Wnonstd-intrinsic, and -Wline-truncation.

    donc je vais utiliser -pedantic-errors -Wall -Wconversion -Wimplicit-interface -Wsurprising -Wunderflow -Wunused-labels -Wline-truncation -W

    Donc ma commande de compilation, qui était :

    $ gfortran $BN/S.f -fdefault-real-8 -g -o ./S

    devient :

    $ gfortran $BN/S.f -fdefault-real-8 -g -pedantic-errors -Wall -Wconversion -Wimplicit-interface -Wsurprising -Wunderflow -Wunused-labels -Wline-truncation -W -o ./S


    Et ça me donne plein d'erreurs, alors que je pensais avoir pondu du code vraiment tout propre; mébon, il y en a des faciles à corriger, les variables ou labels inutilisés, il y en a des moins faciles qui nécessitent l'intervention du physicien quand il y a des conversions integer-real entre des grandeurs dont je sais à peine de quel type elle sont physiquement, et il y en a que je ne comprends méme pas, et c'est lâ que j'aurais besoin de ton aide : que signifie "Warning: Procedure 'foo-bar' called with an implicit interface at (1)." Je ne sais pas ce qu'est une "implicit interface".
    Merci de m'éclairer sur ce point pour que je puisse continuer à avancer,
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

Discussions similaires

  1. OCAML/C - segfault étrange
    Par SkWizZ_Soji dans le forum Caml
    Réponses: 4
    Dernier message: 22/08/2009, 12h10
  2. Segfault étrange sur un malloc
    Par |PaRa-BoL dans le forum C
    Réponses: 38
    Dernier message: 17/01/2007, 14h57
  3. Affichage étrange sous directGraphic
    Par Cyrik dans le forum DirectX
    Réponses: 7
    Dernier message: 13/09/2003, 13h29
  4. Fonction étrange
    Par Defrag dans le forum Flash
    Réponses: 3
    Dernier message: 17/07/2003, 19h01
  5. [TP]Portage d'un encodeur MP3 Fortran en pur Pascal...
    Par Christophe Fantoni dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 04/07/2003, 17h34

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