sentencias programas programa notacion intrinsecas identificadores funciones estructura ejemplos cientifica arcotangente acumulador fortran fortran90 gfortran

programas - Dónde poner `implícito none` en Fortran



notacion cientifica en fortran (4)

¿Necesito poner implicit none dentro de cada función y subrutina?

¿O es suficiente ponerlo al principio del módulo que contiene estas funciones y subrutinas?

¿O es suficiente ponerlo al principio del programa que está utilizando estos módulos?

Desde la observación del código de trabajo de otros, implicit none se incluye en todos estos lugares. No estoy seguro de si esto se hace de manera redundante porque la eliminación de implicit none de las subrutinas aún se compila y produce el mismo resultado.

Por cierto, estoy usando gfortran fortran 90 .


Aquí hay una respuesta informal basada en lo que funciona para mí.

Mi código Fortran está en dos tipos de archivos: los que contienen un programa principal y los que contienen un solo módulo. En cada tipo de archivo, IMPLICIT NONE aparece justo después de las declaraciones "program foo" o "module foo" y después de las instrucciones USE en la parte superior. No aparece dentro de subrutinas o funciones, porque eso sería redundante.


La declaración implicit (incluyendo la implicit none ) se aplica a una unidad de alcance . Tal cosa se define como

Construcción BLOQUEO, definición de tipo derivado, cuerpo de interfaz, unidad de programa o subprograma, excluyendo todas las unidades de alcance anidadas en ella

Esta "exclusión de todas las unidades de alcance anidadas en él" sugiere que puede ser necesario / deseable no tener implicit none en cada función y subrutina (colectivamente, procedimientos) definidos en un módulo. Sin embargo, dentro de los procedimientos contenidos en un módulo hay una asignación predeterminada basada en la unidad de alcance del host . Por lo tanto, con implicit none en el módulo no es necesario tener eso en los procedimientos contenidos.

Esta regla de unidad de alcance de host se aplica igualmente a los programas internos. Esto significa que implicit none en el programa principal cubre todos los procedimientos contenidos en él; y que lo mismo se aplica a los programas internos de los procedimientos del módulo. Las construcciones de bloques también ven esto, y la declaración implicit ni siquiera está permitida dentro de uno de estos.

Sin embargo, las funciones / subrutinas externas no heredarán el comportamiento implícito de un programa o módulo, y los módulos no lo heredarán de los programas / otros módulos que los use . Esto claramente tiene sentido ya que la tipificación implícita debe ser conocida en el momento de la compilación y debe estar bien definida, independientemente de su uso final.

Además, uno no puede hacer

implicit none use somemodule end program

Una declaración implicit debe seguir todas las declaraciones de use .

Esta regla de unidad de alcance de host en particular no se aplica a los cuerpos de interfaz. La respuesta de IanH motiva esa excepción, pero es lo suficientemente importante como para volver a hacer hincapié. Ha causado mucha confusión.

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

Con respecto a la prueba de eliminar la implicit none de una subrutina: si el código es válido con la implicit none , debe ser válido e idéntico sin esa declaración. Todas las entidades deben declararse explícitamente en el primer caso, por lo que no se aplicarán reglas implícitas en el segundo.


No, sí (más o menos) y no.

Una vez por unidad de programa (que no es lo mismo que una vez por programa) y en cada interfaz es suficiente.

Una unidad de programa es un programa principal, un módulo, un subprograma externo (una función o un subprograma de subrutina que no aparece después de la declaración CONTAINS de otro tipo de unidad de programa), una unidad de programa de datos en bloque o un submódulo. A menos que se especifique lo contrario con una declaración IMPLICIT, el valor predeterminado en cada unidad de programa es el mapeo predeterminado de las cosas que comienzan con IN como entero predeterminado y todo lo demás como real predeterminado.

El mismo principio se aplica a los cuerpos de interfaz, ya que se supone que son una instantánea de la parte de especificación de un procedimiento definido en otra unidad de programa. Esa otra unidad de programa tendría la asignación predeterminada a menos que se especifique lo contrario, por lo que el cuerpo de la interfaz tiene la asignación predeterminada a menos que se especifique lo contrario.

Dentro de una unidad de programa, los subprogramas internos o subprogramas de módulos heredan cualquier tipo de escritura implícita que se especifique en su anfitrión, en ausencia de una declaración IMPLICIT "local" dentro del subprograma propiamente dicho.

La especificación redundante de IMPLICIT NONE es inofensiva. A menudo se ve que los subprogramas que antes eran subprogramas externos se han colocado en un módulo.


Si está utilizando gfortran , también puede simplemente agregar un parámetro -fimplicit-none .

Tenga en cuenta que esta es una solución específica del compilador. Otros compiladores extendidos pueden no soportar este parámetro. Por ejemplo, el ifort de Intel ignora esto como una opción desconocida.