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