gpt4 book ai didi

fortran - 在 Fortran 中将 `implicit none` 放在哪里

转载 作者:行者123 更新时间:2023-12-03 10:00:18 24 4
gpt4 key购买 nike

我需要把implicit none在每个函数和子程序中?

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

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

观察其他人的工作代码,implicit none包含在所有这些地方。我不确定这是否是多余的,因为删除 implicit none from 子程序仍然编译并产生相同的输出。

顺便说一句,我正在使用 gfortran fortran 90 .

最佳答案

implicit声明(包括 implicit none )适用于范围单元。这样的事情被定义为

BLOCK construct, derived-type definition, interface body, program unit, or subprogram, excluding all nested scoping units in it


这种“排除其中的所有嵌套范围单元”表明可能有必要/希望拥有 implicit none在模块中定义的每个函数和子例程(统称为过程)中。但是,包含在模块中的过程内部有一个基于主机范围单元的默认映射。因此,使用 implicit none在模块中,没有必要在包含的过程中包含它。
此主机范围单元规则同样适用于内部程序。这意味着 implicit none在主程序中涵盖了其中包含的所有程序;这同样适用于模块过程的内部程序。 block 结构也可以看到这个, implicit其中之一甚至不允许声明。
但是,外部函数/子例程不会从程序或模块继承隐式行为,并且模块不会从 use 的程序/其他模块继承它。他们。这显然是有道理的,因为隐式类型必须在编译时知道,并且无论其最终用途如何,都必须明确定义。
此外,不能将来自一个程序单元的隐式规则应用于它使用的模块,例如:
implicit none
use somemodule

end program
一个 implicit声明必须遵循所有 use陈述。
同样,子模块本身就是一个程序单元,与它的祖先不同。模块或子模块是扩展它的子模块的父模块,而不是主机:主机范围单元规则不适用,并且子模块不从其父模块继承映射规则。没有 implicit在子模块的范围内声明默认规则将在那里应用。
主机范围单元规则尤其不适用于接口(interface)主体。 IanH's answer激发了这个异常(exception),但这是一件足够重要的事情来重新强调。它引起了很多困惑。
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
关于删除 implicit none的测试来自子程序:如果代码对 implicit none 有效那么它必须是有效的并且没有那个声明是相同的。在前一种情况下,所有实体都必须显式声明,因此在后一种情况下不会应用隐含规则。

关于fortran - 在 Fortran 中将 `implicit none` 放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com