gpt4 book ai didi

fortran - 使用 gfortran 在 Fortran 90 中编写和调用纯子例程

转载 作者:行者123 更新时间:2023-12-04 03:19:37 45 4
gpt4 key购买 nike

使用 gfortran 在 Fortran 90 中编写和调用纯子例程时,如何找出编译器发出此错误的原因?

Error: Subroutine call to XXXX at (1) is not PURE

我会尽可能具体地提出我的问题,同时又足够笼统以对其他人有用,因此我将避免粘贴我的实际代码,而是概述发生的事情。

我知道 Fortran 90 中有各种关于纯过程的规则,我认为基本上可以归结为不允许在函数或子例程中产生副作用,并且不允许更改用 intent(in) 声明的子例程参数。我有一系列最初未声明为纯的子例程,其参数没有声明意图,但仍然没有执行副作用。首先,我将所有参数声明更改为具有显式声明的意图,inoutinout。然后,我将所有子例程声明为 PURE。自然地,第一次尝试时出现了很多错误,但编译器告诉我错误是什么(例如,正在修改带有 intent(in) 的某某参数),所以逐个-我把它们都修好了。

然而,这些过程之间存在调用,所以现在我仍然会遇到如上所示形式的许多错误:Subroutine call to XXXX at (1) is not PURE。我不明白的是为什么调用不纯。我已尽我所能使 XXXX 成为纯的,但编译器仍然认为它不是。

所以我的问题——换句话说——是:我如何让 gfortran 告诉我为什么它认为 XXXX 不纯?

最佳答案

“将我正在处理的库中的所有 PURE 子例程放入一个模块(我的客户端代码随后使用了它)。......不知道为什么......,但在做了更多之后出现了有用的错误消息,使我能够追踪剩余的杂质。”

将子例程放入模块中然后使用它们会使接口(interface)显式化。这允许编译器检查调用和子例程之间的一致性,并在存在差异时生成错误消息。非常有用,因此将子例程和函数放入模块中是一种很好的做法。

使接口(interface)显式化的另一种方法是编写接口(interface),但这是额外的工作,而且是出错的额外步骤。

对于纯子例程/函数有一长串要求。如果您有 Metcalf、Reid 和 Cohen 解释的 Fortran 95/2003,请参阅第 6.10 节。例如,没有“保存”变量,没有停止语句,没有外部文件的 IO,...

您也可以尝试其他编译器,看看它们的错误信息是否更有帮助。其他免费的,取决于操作系统,包括 g95 和 Sun Studio。

关于fortran - 使用 gfortran 在 Fortran 90 中编写和调用纯子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1498973/

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