2017-08-15 5 views
1

Il s'agit d'une fonction fortran 90 que j'ai dans un programme principal. Comme vous pouvez le voir plusieurs types de variables tels que ZLAMS ne sont pas déclarés en haut. Mais gfortran 5.2 ne signale aucune erreur. Cependant, si je déplace ce code vers un module séparé et que j'appelle cette fonction dans le module principal, toutes les variables non déclarées signalent une erreur de compilation. Pourquoi ?gfortran ne signale aucune erreur de compilation lorsque les variables de fonction ne sont pas déclarées

REAL(kind=sp) FUNCTION ABCTEST (PHIS, LAMS, POLPHI, POLLAM) 
use k_parameters,ONLY:& 
    sp 

REAL(KIND=SP)  LAMS,PHIS,POLPHI,POLLAM 

DATA  ZRPI18 , ZPIR18/57.2957795 , 0.0174532925/

SINPOL = SIN(ZPIR18*POLPHI) 
COSPOL = COS(ZPIR18*POLPHI) 
ZPHIS = ZPIR18*PHIS 
ZLAMS = LAMS 
IF(ZLAMS.GT.180.0) ZLAMS = ZLAMS - 360.0 
ZLAMS = ZPIR18*ZLAMS 
ARG  = COSPOL*COS(ZPHIS)*COS(ZLAMS) + SINPOL*SIN(ZPHIS) 

ABCTEST = ZRPI18*ASIN(ARG) 

RETURN 
END FUNCTION ABCTEST 
+1

Ne pas déclarer explicitement les choses n'est pas nécessairement une condition d'erreur (lire à propos de _implicit declaration_) mais pour savoir pourquoi votre cas avec un module ne fonctionne pas, nous aurons besoin de voir un exemple de cela. – francescalus

Répondre

2

Vous devez utiliser IMPLICIT NONE en haut de chaque unité de compilation pour obtenir une telle erreur. Sinon, les règles de typage implicites sont en vigueur.

Aucun autre type de déclaration implicite à l'exception de IMPLICIT NONE n'est recommandé dans Fortran moderne. Il devrait être utilisé dans tout code moderne. Chaque unité de compilation désigne toute procédure externe, programme principal et chaque module ou sous-module. Les procédures du module verront l'instruction implicite du module due à l'association de l'hôte. La même chose vaut pour les procédures internes contrôlées par l'instruction implicite de la procédure hôte.

+0

Merci - réponse rapide! Vraiment apprécié. Et dans le module? Je n'ai pas non plus d'implicite dans le module. – gansub

+0

Il suffit de mettre 'IMPLICIT NONE' en haut du module. –

+0

J'ai compris. Donc, si je mets IMPLICIT NONE en haut du module, cela devrait suffire. – gansub