我在其中一个fortran函数中初始化了一个变量。我在另一个功能中使用它。但价值并不相同。在其他函数调用我得到垃圾值。我如何保持初始值。
例如:
entry a() num_calls=0 entry b() num_calls= num_calls + 1
从条目“b”我得到num_calls作为一些垃圾
答案 0 :(得分:5)
在经典的Fortran(Fortran 77或更早版本)中,您需要确保在公共块中定义num_calls - 可能是命名的公共块。
COMMON /magic/ num_calls
我没有使用Fortran 90,所以我不知道它有什么额外的设施。它可能会保留命名的公共块以实现向后兼容,但也可能提供更好的功能。
我也作弊,并使用了变量的隐式声明。完整的,我应该写:
INTEGER*4 num_calls
COMMON /magic/ num_calls
答案 1 :(得分:4)
对于FORTRAN 77,Jonathan Leffler的方法将起作用 - 正如他指出的那样,Fortran 90及其后续版本也支持COMMON
块。但是,由于您可以访问Fortran 90 / Fortran 2003编译器,因此没有理由使用COMMON
块 - 将它们与计算的GOTO
和{{1一起留在历史记录堆中}}
用于存储一组相关变量(和函数)的Fortran 90方法不再是ENTRY
块,而是COMMON
。对于您的代码,这是相对简单的:
MODULE
然后,在要使用num_calls的子程序中,添加
module count_calls
integer :: num_calls = 0
end module count_calls
到子程序本身或包含范围(即use count_calls
或另一个program
)。
答案 2 :(得分:1)
您需要在任一子例程之外声明num_calls
,以使其生命周期与子例程调用无关。实际上讲FORTRAN的人可以为您提供一些示例代码......
答案 3 :(得分:1)
您应该使用“save”属性声明变量。这样变量就在调用之间存在。有一些编译器选项可以将所有变量标记为“save”,因为旧的编译器默认情况下会这样做,或者取决于优化级别。
integer*4, save :: num_calls
大多数语言的标准功能是局部变量在超出范围时未定义。