- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 gfortran 在 Fortran 90 中编写和调用纯子例程时,如何找出编译器发出此错误的原因?
Error: Subroutine call to XXXX at (1) is not PURE
我会尽可能具体地提出我的问题,同时又足够笼统以对其他人有用,因此我将避免粘贴我的实际代码,而是概述发生的事情。
我知道 Fortran 90 中有各种关于纯过程的规则,我认为基本上可以归结为不允许在函数或子例程中产生副作用,并且不允许更改用 intent(in) 声明的子例程参数
。我有一系列最初未声明为纯的子例程,其参数没有声明意图,但仍然没有执行副作用。首先,我将所有参数声明更改为具有显式声明的意图,in
、out
或 inout
。然后,我将所有子例程声明为 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/
我是一名优秀的程序员,十分优秀!