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 :

question de visibilité d'une routine externe, depuis une routine dans un module.


Sujet :

Fortran

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 47
    Points
    47
    Par défaut question de visibilité d'une routine externe, depuis une routine dans un module.
    Bonjour, je ne comprends pas le comportement suivant en terme de visibilité de variable et j'aimerais bien que quelqu'un veuille bien m'éclairer...

    Quand une routine qui est dans un module appelle une autre routine, externe au module, je constate que je ne peux pas passer de tableau en argument.

    Par exemple, j'ai le module "test" ci-dessous (dans le fichier test.f) ainsi que le programme principal (main.f) et une routine externe() (fichier externe.f)
    J'obtiens la sortie ci-dessous alors que je m'attendais à la même sortie pour les 2 routines...
    TAB INTERNE = 1 2 3 4 5 6 7 8 9 10
    TAB EXTERNE =

    Et ce qui en dehors de cette incompréhension me surprend encore plus, c'est que si je mets une autre dimension pour le tableau (9 au lieu de 10 par exemple)
    ALORS, ca plante sur un signal SIGSEGV !!! (alors que ça ne plante pas avec 10 !!!!!)

    Merci pour votre aide...

    Voici pour LE MODULE : test.f :
    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
     
         MODULE TEST 
          IMPLICIT NONE
          INTEGER, DIMENSION(:),ALLOCATABLE ::  TAB
          CONTAINS 
     
          SUBROUTINE CHECK_IT
           ALLOCATE(TAB(10))
           TAB=(/(i,i=1,10)/)
           CALL INTERNE(TAB)
           CALL EXTERNE(TAB)
           DEALLOCATE(TAB)
          END SUBROUTINE CHECK_IT
     
          SUBROUTINE INTERNE(ARRAY)
           IMPLICIT NONE 
           INTEGER, INTENT(INOUT),DIMENSION (:) :: ARRAY
           WRITE(*,*) 'TAB INTERNE = ', ARRAY
          END SUBROUTINE INTERNE
     
          END MODULE

    main.f:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                PROGRAM MAIN
                USE TEST
                IMPLICIT NONE
                CALL CHECK_IT
                END PROGRAM

    externe.f
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          SUBROUTINE EXTERNE(ARRAY)
          IMPLICIT NONE 
          INTEGER, INTENT(INOUT),DIMENSION (:) :: ARRAY
          WRITE(*,*) 'TAB EXTERNE = ', ARRAY
          END SUBROUTINE EXTERNE


    pour compiler, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gfortran -c test.f 
    gfortran -c -I./ *.f
    gfortran -o exec  *.o

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Citation Envoyé par bastringue Voir le message
    Quand une routine qui est dans un module appelle une autre routine, externe au module, je constate que je ne peux pas passer de tableau en argument.
    Salut.
    il est nécessaire dans ce cas de créer une interface à la routine externe dans le module. La compilation des deux fichiers sources (module et routine externe) se fait sans anomalie, mais l'interface sert à transmettre le bon argument (type et taille) à l'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
          MODULE TEST
          IMPLICIT NONE
     
          INTEGER, DIMENSION(:),ALLOCATABLE ::  TAB
     
            INTERFACE
              SUBROUTINE EXTERNE(ARRAY)
              INTEGER, INTENT(IN), DIMENSION (:) :: ARRAY
              END SUBROUTINE EXTERNE
            END INTERFACE
     
          CONTAINS 
          ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 47
    Points
    47
    Par défaut Merci
    Merci pour le coup de main...je n'ai plus qu'à lire un peu plus sur les interfaces !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Un conseil qu'on ne répétera jamais assez: compiler avec des options de debug (e.g. -Wall -ffpe-trap=invalid,zero,overflow -fbounds-check -finit-real=nan -fbacktrace ) permet d'être alerté de ce genre de problème (parmi d'autres). A utiliser sans modération!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer une application externe depuis une applet
    Par kjimmie dans le forum Applets
    Réponses: 2
    Dernier message: 18/12/2011, 14h19
  2. Affichage d'une liste externe depuis une machine distante.
    Par cleml12 dans le forum Configuration
    Réponses: 0
    Dernier message: 14/12/2011, 12h28
  3. Réponses: 4
    Dernier message: 14/10/2009, 11h52
  4. Réponses: 1
    Dernier message: 31/08/2008, 20h04
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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