3

我已经在其中一个 fortran 函数中初始化了一个变量。我在另一个函数中使用它。但价值并不保持不变。在其他函数调用中,我得到了垃圾值。我如何维护初始化值。

前任:

条目 a()
num_calls=0

条目 b()
通话次数= 通话次数 + 1

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

4

4 回答 4

5

在经典的 Fortran(Fortran 77 或更早版本)中,您需要确保 num_calls 定义在一个公共块中 - 可能是一个命名的公共块。

COMMON /magic/ num_calls

我没有用过 Fortran 90,所以我不知道它有什么额外的功能。它可能保留命名的公共块以实现向后兼容性,但也可能提供更好的东西。

我也作弊,并使用了变量的隐式声明。完整地,我应该写:

INTEGER*4 num_calls
COMMON /magic/ num_calls
于 2009-07-21T06:59:06.237 回答
4

对于 FORTRAN 77,Jonathan Leffler 的方法将起作用 - 正如他所指出的,Fortran 90 及更高版本也支持COMMON块。但是,由于您可以访问 Fortran 90/Fortran 2003 编译器,因此没有理由使用COMMON块 - 将它们与计算的GOTOENTRY.

Fortran 90 存储一组相关变量(和函数)的方法不再是COMMON块,而是一个MODULE. 对于您的代码,这相对简单:

module count_calls

    integer :: num_calls = 0

end module count_calls

然后,在要使用 num_calls 的子例程中,添加

use count_calls

到子例程本身或包含范围(即 aprogram或 another module)。

于 2009-07-21T15:53:59.127 回答
1

您需要在任一子num_calls例程之外声明,以便其生命周期与任一子例程调用无关。真正会说 FORTRAN 的人可以为您提供一些示例代码...

于 2009-07-21T06:50:08.173 回答
1

您应该使用“保存”属性声明变量。这样变量就存在于调用之间。有编译器选项可以将所有变量标记为“保存”,因为旧编译器默认执行此操作或取决于优化级别。

    integer*4, save :: num_calls

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

于 2011-09-08T22:38:53.587 回答