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 :

Compilation/édition de liens avec modules blocs interfaces


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Par défaut Compilation/édition de liens avec modules blocs interfaces
    bonjour,

    j'ai un problème (évidemment).

    J'ai créé un certains nombres de routines et fonctions en F90. Un sous-ensemble de ces routines et fonctions appartient à un même module.

    Mais cet ensemble représentant une longue liste de lignes de code, j'ai mis chaque routine dans un fichier séparé et j'ai créé un fichier nomModule.f90 dans lequel on retrouve toutes les interfaces de mes fonctions. Tout ça dans un souci de lisibilité. Donc, en gros ça me permet de m'organiser en mettant tous les fichiers sources d'un même module dans un répertoire dédié, etc..

    Bref..

    j'ai un problème de compilation avec une routine de mon module qui fait appel à une fonction du même module. Il se trouve que cette fonction renvoie un tableau de valeurs. Je suis obligé de déclarer explicitement l'interface de ma fonction dans ma routine, alors qu'elles sont sensées appartenir au même module. A priori, ça risque de se reproduire avec d'autres modules à venir, et je trouve ça peu élégant.

    maRoutine.f90 :
    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
    subroutine maRoutine(x,y,z)
    
    integer :: x,y
    integer,dimension(:) :: z
    
    !obligatoire sinon erreur de compilation
    interface
    function maFonction(x,y)
    integer :: x,y
    integer,dimension(x+y) :: z
    end function
    end interface
    
    z = maFonction(x,y)
    
    end subroutine
    maFonction.f90
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function maFonction(x,y)
     
    integer :: x,y
    integer,dimension(x+y) :: maFonction
     
    maFonction(i) = ...
     
    end function
    monModule.f90
    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
     
    module monModule
     
    interface
    subroutine maRoutine(x,y,z)
    integer :: x,y
    integer,dimension(:) :: z
    end subroutine
    end interface
     
    interface
    function maFonction(x,y)
    integer :: x,y
    integer,dimension(x+y) :: z
    end function
    end interface
     
    contains
     
    ...
     
    end module
    et quand je compile, sans avoir l'interface de ma fonction explicitement déclarée dans ma fonction, j'obtiens ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Error: Function 'maFonction' at (1) has no implicit type

    y'a-t-il une astuce de compilation qui m'ai échappé ou bien une façon d'écrire les modules avec blocs interfaces pour que les fonctions et routines du module se connaissent entre elles sans avoir besoin de les redéclarer ? ou alors le problème d'une fonction qui retourne un tableau de valeurs est-il trop complexe pour F90 et doit donc forcément passer par une déclaration explicite d'interface à l'intérieur même de la routine ?

    Merci de votre attention.

  2. #2
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Par défaut
    Hmm.. je pense avoir trouvé la réponse :

    Il est des cas où l’interface d’appel doit être “explicite”. Il en existe 10 :
    • fonction à valeur tableau,
    • fonction à valeur pointeur,
    • fonction à valeur chaîne de caractères dont la longueur est déterminée
    dynamiquement,
    • tableau à profil implicite,
    • argument muet avec l’attribut pointer ou target,
    • passage d’arguments à mots-clé,
    • argument optionnel,
    • procédure générique,
    • surcharge ou définition d’un opérateur,
    • surcharge du symbole d’affectation.
    A priori, au moins tant que je compilerais dans des fichiers séparés, je serais obligé de déclarer mes interfaces de fonctions à valeur de retour de type tableau directement dans mes routines appelantes.

  3. #3
    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
    Moi je suis partisant du TOUT EXPLICIT donc en général je fait un 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    module toto
     
      interface
        function titi(P1,P2)
          implicit none
          real(kind=8),intent(in) :: P1,P2
          real(kind=8),dimension(1:)::titi
        end function titi
       
        subroutine tata(P1,P2)
          implicit none
          real(kind=8),intent(in) :: P1,P2
        end subroutine titi
      end interface
     
    end module toto
     
    function titi(P1,P2)
      implicit none
      real(kind=8),intent(in) :: P1,P2
      real(kind=8),dimension(1:)::titi
      {ce que doit faire ta fonction}
    end function titi
       
    subroutine tata(P1,P2)
      use toto, only : titi
      implicit none
      real(kind=8),intent(in) :: P1,P2
    end function titi
    en gros la fonction use te dit d'aller quand voir dans le module... si tu oublie le only, il va dire que tu appele ta subroutine de manière récurente et le compilo va râler...

  4. #4
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Par défaut
    Salut et merci !

    effectivement, j'ai pu résoudre certains conflits et avoir un résultat un peu mieux ficelé grâce au ONLY.
    Et oui tu as raison dans la mesure du possible, il faut expliciter au maximum. Ca évite bien des problèmes par la suite.

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

Discussions similaires

  1. BLAS: édition de liens avec libcblas.a
    Par micheldup dans le forum C++
    Réponses: 2
    Dernier message: 10/10/2007, 01h21
  2. Réponses: 5
    Dernier message: 17/04/2007, 11h10
  3. Ordre de l'édition des liens avec GCC
    Par Matthieu Brucher dans le forum Linux
    Réponses: 6
    Dernier message: 29/08/2006, 07h56
  4. Erreur d'édition de liens avec __imp__RegCloseKey
    Par gdpasmini dans le forum MFC
    Réponses: 2
    Dernier message: 23/03/2006, 14h18
  5. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50

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