使用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不纯?
答案 0 :(得分:2)
“将我正在处理的库中的所有PURE子程序放入一个MODULE(我的客户端代码然后USEd)。......不确定为什么.....,但是这样做之后更多出现了有用的错误信息,这使我能够追踪剩余的杂质。“
将子例程放入模块然后使用它们使接口显式化。这允许编译器检查调用和子例程之间的协议,并在出现差异时生成错误消息。非常有用,所以将子程序和函数放入模块中是很好的做法。
使接口显式化的另一种方法是编写一个接口,但这是额外的工作,也是一个错误的额外步骤。
纯子程序/函数有很多要求。如果您有Metranf,Reid和Cohen的Fortran 95/2003解释,请参阅第6.10节。例如,没有“保存”变量,没有停止语句,外部文件没有IO,......
您还可以尝试其他编译器,看看他们的错误消息是否更有帮助。其他免费的,取决于操作系统,包括g95和Sun Studio。
答案 1 :(得分:1)
我会在答案中更加清楚我的问题。由于这些原因,我不愿意发布我的代码。
所以我希望找出,而不是如何修复我的代码并制作程序PURE,而是找出如何从gfortran中哄骗更多有用的信息,以帮助我修复我的代码。
我所做的两件事有助于实现这些目标。当然,您的结果可能会有所不同。
这是一个模糊的问题,我知道,而且我不确定它会有多大用处。感谢所有阅读,评论并添加答案的人。
答案 2 :(得分:0)
可能是因为它没有标记为PURE。子例程是纯粹的事实与它的参数与它的作用无关,而与它被声明为PURE的事实无关。 (当然,一旦声明为纯粹,你对参数所做的就会发挥作用并进行检查。)