2

Fortran 中的公共块是否用于全局变量的目的?

如果是这种情况,那么这些值可以通过子程序修改吗?

SAVE在子程序中存储修改后的参数以供子程序内部以外的用途使用?

4

2 回答 2

1

[编辑:我的答案基于理解问题是关于SAVE一个公共块,而不是局部变量(即,作为 的替代COMMON)。否则请参阅杯子的评论。]

公共块确实是 Fortran 77 中“全局”变量的方法。块中的变量可以在子程序中修改,并且更改将在其他地方可见(请参阅警告)。

SAVE不会直接改变其他子程序使用修改后的变量的能力。相反,它的目的是确保当块超出范围时块中的数据不会变得未定义。请注意,如果SAVE存在于一个子程序中,则它必须存在于所有具有该块特征的子程序中的块上(但不一定是主程序)。

根据记忆,这意味着(这不是真正的 F77;对于这个概念):

  call s1
  call s2
end

subroutine s1
  common /bl/ i,j
  i=2
end subroutine s1

subroutine s2
  common /b1/ i,j
  print *, i
end subroutine s2

不会乖乖的。[现实世界的编译器是否让你付费是值得商榷的。]

公共块中的变量不能SAVE单独应用属性,并且在局部变量上具有属性不会改变其可访问性。因此,例如,一个SAVE Kin one 子例程不会使该变量在其他任何地方都可以访问。然而,将会发生的是,它在控制从那里返回后(下次进入子程序时)保持其值。

最后,在 Fortran 77 之后还有更好的方法。

于 2014-01-07T18:06:21.693 回答
1

是的,common创建全局变量。Fortran >=90 为此目的提供了模块变量——模块变量应该在新代码中使用而不是通用。common 增加了存储顺序通常不必要的复杂性。公共或模块变量可以被多个程序子程序和函数使用)和主程序。

save主要用于过程中的局部变量,以使这些变量在调用之间保持其值。 fortran SAVE 语句

save也可以应用于模块变量,以保证如果没有使用模块的例程在范围内,它们不会丢失它们的值。这在 Fortran 2008 中不再需要 - 请参阅Fortran 90/95 中的模块何时超出范围?

于 2014-01-08T04:59:39.663 回答