fortran变量范围的难度

时间:2009-07-21 06:38:52

标签: fortran

我在其中一个fortran函数中初始化了一个变量。我在另一个功能中使用它。但价值并不相同。在其他函数调用我得到垃圾值。我如何保持初始值。

例如:

entry a()
num_calls=0

entry b()
num_calls= num_calls + 1

从条目“b”我得到num_calls作为一些垃圾

4 个答案:

答案 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

大多数语言的标准功能是局部变量在超出范围时未定义。