Où mettre 'implicit none' Dans Fortran

Dois-je mettre implicit none dans chaque fonction et sous-programme?

Ou est-il suffisant de le mettre au début du module contenant ces fonctions et sous-programmes?

Ou est-il suffisant de le mettre au début du programme qui utilise ces modules?

D'après l'observation du code de travail des autres, implicit none est inclus dans tous ces endroits. Je ne suis pas sûr si cela est fait de manière redondante car la suppression de implicit none des sous-Programmes encore compilés et produits de la même manière sortie.

Au fait, j'utilise gfortran fortran 90.

23
demandé sur francescalus 2014-06-21 05:21:38

4 réponses

La déclaration implicit (y compris implicit none) s'applique à une unité de cadrage . Une telle chose est définie comme

Construction de bloc, définition de type dérivé, corps d'interface, Unité de programme ou sous-programme, à l'exclusion de toutes les unités de portée imbriquées

Cette "exclusion de toutes les unités de portée imbriquées" suggère qu'il peut être nécessaire/souhaitable d'avoir implicit none dans chaque fonction et sous-programme (collectivement, les procédures) définis dans un module. Cependant, à l'intérieur de procédures contenu dans un module, il existe un mappage par défaut basé sur l'unitéhost scoping. Donc, avec implicit none dans le module, il n'est pas nécessaire d'avoir cela dans les procédures contenues.

Cette règle de l'Unité de portée de l'hôte s'applique également aux programmes internes. Cela signifie que implicit none dans le programme principal couvre toutes les procédures qu'il contient; et que la même chose s'applique pour les programmes internes des procédures de module. Les constructions de blocs voient cela aussi, et l'instruction implicit n'est même pas autorisée dans l'un de ces.

Cependant, les fonctions/sous-programmes externes n'héritent pas du comportement implicite d'un programme ou d'un module, et les modules ne l'héritent pas des programmes/autres modules qui les use. Cela a clairement du sens car le typage implicite doit être connu au moment de la compilation et être bien défini quelle que soit leur utilisation finale.

En outre, on ne peut pas faire

implicit none
use somemodule

end program

Une instruction implicit doit suivre toutes les instructions use.

Cette règle d'Unité de portée hôte notamment ne s'applique pas aux corps d'interface. la réponse de IanH motive cette exception, mais c'est une chose assez importante pour re-stresser. Cela a causé beaucoup de confusion.

module mod
 implicit none

  interface
    subroutine external_sub()
      ! The default implicit typing rules apply here unless there is an implicit
      ! statement, such as implicit none.  Those from the module aren't in force here.
    end subroutine
  end interface

end module

En ce qui concerne le test de suppression de implicit none d'un sous-programme: si le code est valide avec implicit none alors il doit être valide et identique sans cette instruction. Toutes les entités doivent être explicitement déclarées dans le premier cas, de sorte qu'aucune règle implicite ne serait appliquée dans le second.

21
répondu francescalus 2015-07-29 18:11:28

Non, Oui (en quelque sorte) et non.

Une Fois Par unité de programme (ce qui n'est pas la même chose qu'une fois par programme) et dans chaque corps d'interface est suffisant.

Une unité de programme est soit un programme principal, un module, un sous-programme externe (une fonction ou un sous-programme de sous-programme qui n'apparaît pas après L'instruction CONTAINS d'un autre type d'Unité de programme), une unité de programme de données de bloc ou un sous-module. Sauf indication contraire avec une instruction implicite, la valeur par défaut dans chaque unité de programme est le mappage par défaut des choses commençant par I - n Comme entier par défaut et tout le reste comme réel par défaut.

Le même principe s'applique aux corps d'interface-car ils sont censés être un instantané de la partie spécification d'une procédure définie dans une autre unité de programme. Cette autre unité de programme aurait le mappage par défaut, sauf indication contraire, de sorte que le corps de l'interface a le mappage par défaut, sauf indication contraire.

Dans une unité de programme, les sous-programmes internes ou les sous-programmes de modules héritent de tout typage implicite spécifié dans leur hôte, en l'absence d'une instruction implicite "locale" dans le sous-programme proprement dit.

La spécification redondante de NONE implicite est inoffensive. Vous le voyez souvent où des sous-programmes qui étaient auparavant des sous-programmes externes ont été placés dans un module.

6
répondu IanH 2014-06-21 02:30:49

Voici une réponse informelle basée sur ce qui fonctionne pour moi.

Mon code Fortran est dans deux types de fichiers-ceux contenant un programme principal et ceux contenant un seul module. Dans chaque type de fichier, None implicite apparaît juste après les instructions "program foo" ou "module foo" et après les instructions USE en haut. Il n'apparaît pas dans les sous-programmes ou les fonctions, car cela serait redondant.

5
répondu Fortranner 2015-04-17 12:26:42

Si vous utilisez gfortran, vous pouvez simplement ajouter une -fimplicit-none le paramètre.

Notez qu'il s'agit d'une solution spécifique au compilateur. D'autres compilateurs répandus peuvent ne pas prendre en charge ce paramètre. Par exemple, Intel ifort ignore ceci comme une option inconnue.

1
répondu marmistrz 2017-02-03 19:23:29