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 :

Erreur d'exécution


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut Erreur d'exécution
    Bonjour à tous,

    Je fais tourner un programme principal constitué de plusieurs programmes secondaires (avec Intel Fortran)
    Il compile très bien et la création du fichier executable se fait s'en aucun problème. Mais au moment de l'exécuter, il me met le message suivant :

    forrtl: severe (174): SIGSEGV, segmentation fault occurred
    Image PC Routine Line Source
    essai1 0000000000464D87 Unknown Unknown Unknown
    essai1 000000000046393A Unknown Unknown Unknown
    essai1 000000000043B14E Unknown Unknown Unknown
    essai1 000000000040E506 Unknown Unknown Unknown
    essai1 000000000040F212 Unknown Unknown Unknown
    libc.so.6 00002AAAAAD761B0 Unknown Unknown Unknown
    essai1 0000000000405176 Unknown Unknown Unknown
    essai1 000000000040312A Unknown Unknown Unknown
    libc.so.6 00002AAAAAD6349B Unknown Unknown Unknown
    essai1 000000000040306A Unknown Unknown Unknown
    Si quelqu'un peut m'aider à résoudre ce problème.
    Merci et bonne journée.

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Avec ce que tu donnes, on est probable que tu fasses un acces memoire interdit (genre depassement des limites d'un tableau, par exemple). Puisque tu utilises ifort, essaie de compiler avec tous les runtime checkings (-C) et en mode debug (-g), cela te donnera surement un message plus parlant que la trace illisible que le compilateur imprime par defaut.
    Tu peux aussi essayer un debuger ou de mettre des PRINT a des endroits strategiques du code pour voir ou le probleme survient.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Par défaut
    J'ai le même problème.
    J'ai des subroutines qui ont des tableaux d'allocation dynamique en entrée; quand je teste le programme suivant une valeur n qui définit la taille de mes tableaux dynamiques, à partir d'un certain n j'obtiens cette erreur.

    Certains parlent d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    interface
    end interface
    Dans le cas où l'argument est un tableau allouable, il s'agit de remplacer le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Program Eigenvalue
    implicit none
     
    integer                       :: ierr
    integer                       :: ntot
    real, dimension(: , : ), pointer :: matrice
    integer, external             :: genmat
     
    read(5,*) ntot
    ierr = genmat( ntot, matrice )
     
    call Calcul_Eigenvalue( ntot, matrice )
     
    deallocate( matrice )
    end
    par ce qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Program Eigenvalue
    implicit none
     
    integer                       :: ierr
    integer                       :: ntot
    real, dimension(:, : ) , pointer :: matrice
     
    interface
        function genmat( ntot, matrice )
        implicit none
        integer                       :: genmat
        integer, intent(in)           :: ntot
        real, dimension(:, : ) , pointer :: matrice
        end function genmat
    end interface
     
    read(5,*) ntot
    ierr = genmat( ntot, matrice )
     
    call Calcul_Eigenvalue( ntot, matrice )
     
    deallocate( matrice )
    end
    http://ccs.usherbrooke.ca/?t%5B%5D=tt.367&iu=265&

    Doit-on déclarer deux fois la subroutine, une fois avec interface en ne mettant que les variables et une autre fois avec les variables et ce qu'elle fait
    ou bien on peut mettre ceux qu'elle fait aussi quand on la déclare à l'intérieur d'interface ?

    Citation Envoyé par DaZumba
    Avec ce que tu donnes, on est probable que tu fasses un acces memoire interdit (genre depassement des limites d'un tableau, par exemple). Puisque tu utilises ifort, essaie de compiler avec tous les runtime checkings (-C) et en mode debug (-g), cela te donnera surement un message plus parlant que la trace illisible que le compilateur imprime par defaut.
    Tu peux aussi essayer un debuger ou de mettre des PRINT a des endroits strategiques du code pour voir ou le probleme survient.
    dans quel cas on depasse les limites d'un tableau en allocation dynamique?

    pour utiliser -g on doit faire:
    ifort -c -g pgm.f90
    ?
    Dans quel cas fait-on un dépassement mémoire ?

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par tonelli
    Certains parlent d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    interface
    end interface
    Des qu'un argument d'une routine/fonction external (qui n'est pas codee dans le meme fichier que la routine/fonction qui l'appelle, si tu preferes) est un pointeur, alors il est bon de declarer l'interface de cette fonction (si tu connais le C, cela revient a donner le prototype de cette fonction). Cela permet de resoudre des problemes potentiels lors de l'edition de lien.
    Une interface doit contenir:
    - le nom de la routine/fonction et eventuellement le type retourne
    - declaration des arguments (en incluant tous les attributs utiles, genre pointer, allocatable)
    - end subroutine ou end function
    Le code de la fonction/routine est dans un autre fichier (s'il est dans le meme fichier, on n'a pas besoin d'interface).

    dans quel cas on depasse les limites d'un tableau en allocation dynamique?
    Si tu alloues un tableau (statique ou dynamique) de 3 elements et que essaies d'acceder au quatrieme, tu peux avoir une faute de segmentation.

    pour utiliser -g on doit faire:
    Regarde la doc de ton compilateur, c'est bien explique : man ifort. Remarque que -C et -c sont des options (tres) differentes.

Discussions similaires

  1. Erreur 233 during the login process
    Par olibara dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/01/2012, 21h58
  2. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  3. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 16h12
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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