Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran中“隐式无”的位置_Fortran_Fortran90_Gfortran - Fatal编程技术网

Fortran中“隐式无”的位置

Fortran中“隐式无”的位置,fortran,fortran90,gfortran,Fortran,Fortran90,Gfortran,我是否需要在每个函数和子例程中放入隐式none 或者把它放在包含这些函数和子例程的模块的开头就足够了吗 或者把它放在使用这些模块的程序的开头就足够了吗 根据对他人工作代码的观察,隐式无包含在所有这些地方。我不确定这是否是冗余的,因为从仍然编译并生成相同输出的子例程中删除隐式none 顺便说一句,我使用的是gfortran-fortran 90隐式语句(包括隐式无)适用于范围单元。这样的事情被定义为 块构造、派生类型定义、接口体、程序单元或子程序,不包括其中的所有嵌套作用域单元 “排除其中的所有嵌

我是否需要在每个函数和子例程中放入
隐式none

或者把它放在包含这些函数和子例程的模块的开头就足够了吗

或者把它放在使用这些模块的程序的开头就足够了吗

根据对他人工作代码的观察,
隐式无
包含在所有这些地方。我不确定这是否是冗余的,因为从仍然编译并生成相同输出的子例程中删除
隐式none


顺便说一句,我使用的是
gfortran-fortran 90

隐式
语句(包括
隐式无
)适用于范围单元。这样的事情被定义为

块构造、派生类型定义、接口体、程序单元或子程序,不包括其中的所有嵌套作用域单元

“排除其中的所有嵌套作用域单元”表明,在模块中定义的每个函数和子例程(统称为过程)中可能有必要/希望有
隐式none
。但是,在模块中包含的过程中,有一个基于主机范围单元的默认映射。因此,在模块中使用
implicit none
时,不必在包含的过程中使用该函数

此主机作用域单元规则同样适用于内部程序。这意味着主程序中的
implicit none
涵盖了其中包含的所有过程;这同样适用于模块程序的内部程序。块构造也看到了这一点,并且
implicit
语句甚至不允许在其中一个语句中使用

但是,外部函数/子例程不会从程序或模块继承隐式行为,模块也不会从
使用它们的程序/其他模块继承隐式行为。这显然是有意义的,因为隐式类型必须在编译时就知道,并且无论其最终用途如何,都必须定义良好

此外,不能将隐式规则从一个程序单元应用到它使用的模块,例如:

implicit none
use somemodule

end program
隐式
语句必须紧跟在所有
use
语句之后

同样,子模块本身就是一个程序单元,不同于它的祖先。模块或子模块是扩展它的子模块的父模块,而不是主机:主机作用域单元规则不适用,子模块也不从其父模块继承映射规则。如果子模块的作用域中没有
隐式
语句,则默认规则将在那里应用

主机作用域单元规则显然不适用于接口主体。激发了这种例外,但这是一件非常重要的事情,需要重新强调。这引起了很多混乱

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
关于从子例程中删除
隐式无
的测试:如果代码在
隐式无
中有效,则在没有该语句的情况下,它必须有效且相同。在前一种情况下,所有实体都必须显式声明,因此在后一种情况下不会应用任何隐式规则。

否、是(某种程度上)和否

每个程序单元一次(与每个程序一次不同)和每个接口体一次就足够了

程序单元是主程序、模块、外部子程序(不出现在另一类程序单元的CONTAINS语句之后的函数或子程序)、块数据程序单元或子模块。除非用隐式语句另外指定,否则每个程序单元中的默认值都是以I-N作为默认整数,以其他所有内容作为默认实数的默认映射

同样的原则也适用于接口体——因为它们被认为是在另一个程序单元中定义的过程的规范部分的快照。除非另有规定,否则其他程序单元将具有默认映射,因此接口体具有默认映射,除非另有规定

在程序单元内部,内部子程序或模块子程序继承其主机中指定的任何隐式类型,而在子程序本身中没有“本地”隐式语句


隐式NONE的冗余规范是无害的。您经常会在以前是外部子程序的子程序被放入模块的地方看到它。

这里是一个非正式的答案,基于对我有用的内容


我的Fortran代码包含两种类型的文件——一种包含主程序,另一种包含单个模块。在每种类型的文件中,隐式NONE仅出现在“program foo”或“module foo”语句之后以及顶部的USE语句之后。它不会出现在子例程或函数中,因为这是多余的。

如果您使用的是
gfortran
,您也可以简单地添加一个参数


请注意,这是特定于编译器的解决方案。其他广泛使用的编译器可能不支持此参数。例如,英特尔的
ifort
忽略了这一未知选项。

以及现存的FORTRAN 77代码,该代码已经僵化;)。我的视网膜上有穿孔卡片的图像,这会让我的眼睛流血,但即使如此,你也能找到很多。我的帖子中有一个错误,现在已经修复。我在USE语句后面加了隐式NONE。我从不使用INCLUDE语句。你能写一句话来稍微改进你的答案吗?提到程序中包含的函数/子例程与模块中包含的函数/子例程在
隐式无方面的工作方式完全相同?回答得很好。