2017-09-19 6 views
1

Je suis nouveau à Fortran et j'essaie de comprendre si ce qui suit est possible. Mon idée de structurer le programme est de déclarer la précision et les types de variables dans un module. Utilisez ensuite ces variables sans déclarer à nouveau le type dans d'autres modules ou dans le programme principal.Modules de liaison Fortran pour les types de variables de précision et globales

module pre 
implicit none 

    INTEGER, PARAMETER  :: sp=SELECTED_REAL_KIND(6,37) 
    INTEGER, PARAMETER  :: dp=SELECTED_REAL_KIND(15,307) 
    INTEGER, PARAMETER  :: qp=SELECTED_REAL_KIND(33,4931) 

    REAL(dp), PARAMETER  :: pi = 4.*ATAN(1.) 
    REAL(dp)    :: H        
    REAL(dp)    :: M 
    REAL(dp)    :: KR 

end module pre 

Maintenant, je veux utiliser toutes les variables dans un autre module qui contient une ou plusieurs fonctions, telles que:

module hon 
use pre 
implicit none 

contains 
    function KE(H,M) result(KR) 
     KR = 2*PI/H/M 
    end function KE 
end module hon 

Puis-je utiliser gfortran dans cet ordre:

gfortran -c mod_pre.f90 
gfortran -c mod_hon.f90 

Comme 'module pre' fait partie de 'module hon' je compile dans l'ordre, mais gfortran montre une erreur.

Avec le code ci-dessus, je comprends que les types de variables et les paramètres doivent avoir été inclus par USE; Mais le message que je reçois de gfortran est qu'aucune de mes variables n'a le type IMPLICIT lorsque j'essaie de compiler 'module hon'.

Quelqu'un pourrait-il clarifier le problème ou suggérer une solution? Je voudrais éviter que mes variables soient dispersées dans plusieurs modules.

Merci!

Répondre

0

Dans l'instruction de fonction, le result(kr) indique que le résultat de la fonction a le nom kr. Ce résultat de la fonction n'est pas la même chose que la variable du module kr. En particulier, ce résultat de la fonction rend inaccessible la variable du module.

Le résultat de la fonction est spécifique à la fonction elle-même et ses propriétés doivent être déclarées dans le sous-programme de la fonction. De même, les arguments fictifs de la fonction, H et M, sont distincts des variables du module et doivent être déclarés dans le sous-programme de la fonction.

Au-delà, vous avez peut-être des préoccupations similaires à other question. Pour être clair, il n'est pas possible de dire quelque chose comme "tous les résultats de la fonction appelée kr et tous les arguments fictifs appelés H ou M ont ces caractéristiques". Chaque objet individuel doit avoir les propriétés.

Cependant, bien que je ne recommande pas, cela est une situation dans laquelle l'inclusion de texte littéral (en utilisant un préprocesseur ou inclure le fichier) pourrait vous aider:

function ke(H, M) result (kr) 
    include 'resdummydecls' 
    ... 
end function 

où le fichier a les déclarations.

+0

Bonjour francescalus, s'il te plaît, fais attention à moi. Ensuite, il n'est pas utile de déclarer les types de variables et d'utiliser ce module dans d'autres? Par exemple, le résultat 'kr' sera toujours un réel (dp) et aussi le reste des variables d'entrée. Cela signifierait que je dois déclarer «H» ou n'importe quel autre dans chaque module au lieu de simplement le définir une fois? – musi

+0

Dans votre exemple, sp, dp et qp peuvent être utilisés comme suit: 'real (kind = dp) :: ke' pour définir le type de fonction. La variable * kr comme mention de @francescalus est redéfinie comme étant locale. Le champ 'kr' sera utilisé si aucun' kr' local n'est défini. –

+0

Bonjour, merci pour vos réponses, j'avais travaillé autour de la solution et le seul moyen que j'ai trouvé est de redéfinir les variables à l'intérieur de la fonction. Je fais maintenant face à un autre problème concernant la fonction comme les états de gfortran que je transmets des variables REAL (4) à REAL (8). Je trouve que c'est un peu difficile de commencer. Y a-t-il un moyen de surmonter ce problème? – musi