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

时间:2009-09-30 15:45:21

标签: fortran gfortran

使用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不纯?

3 个答案:

答案 0 :(得分:2)

“将我正在处理的库中的所有PURE子程序放入一个MODULE(我的客户端代码然后USEd)。......不确定为什么.....,但是这样做之后更多出现了有用的错误信息,这使我能够追踪剩余的杂质。“

将子例程放入模块然后使用它们使接口显式化。这允许编译器检查调用和子例程之间的协议,并在出现差异时生成错误消息。非常有用,所以将子程序和函数放入模块中是很好的做法。

使接口显式化的另一种方法是编写一个接口,但这是额外的工作,也是一个错误的额外步骤。

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

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

答案 1 :(得分:1)

我会在答案中更加清楚我的问题。由于这些原因,我不愿意发布我的代码。

  1. 我不希望别人为我调试我的代码。这太过分了。
  2. 我希望我的问题和答案更加通用。
  3. 似乎gfortran告诉我我的子程序不是PURE,但它没有告诉我为什么它认为它们不是纯粹的。
  4. 所以我希望找出,而不是如何修复我的代码并制作程序PURE,而是找出如何从gfortran中哄骗更多有用的信息,以帮助我修复我的代码。

    我所做的两件事有助于实现这些目标。当然,您的结果可能会有所不同。

    1. 将此标志添加到gfortran命令行:-fmax-errors = 100 当然,我之前已经做过,但似乎还没有告诉我我需要知道什么。
    2. 将我正在处理的库中的所有PURE子程序放入MODULE(我的客户端代码然后USEd)。由于这个库的祖先是Fortran77,最初,情况并非如此。不知道为什么(这就是为什么我强调“你的结果可能会有所不同”),但在这之后出现了更多有用的错误信息,这使我能够追踪剩余的杂质。
    3. 这是一个模糊的问题,我知道,而且我不确定它会有多大用处。感谢所有阅读,评论并添加答案的人。

答案 2 :(得分:0)

可能是因为它没有标记为PURE。子例程是纯粹的事实与它的参数与它的作用无关,而与它被声明为PURE的事实无关。 (当然,一旦声明为纯粹,你对参数所做的就会发挥作用并进行检查。)