Fortran中SAVE和COMMON的目的

时间:2014-01-07 17:41:58

标签: fortran fortran-common-block

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

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

SAVE是否会在子程序中存储修改后的参数,以用于子程序以外的用途?

2 个答案:

答案 0 :(得分: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 K不会使该变量在其他任何地方都可访问。然而,会发生什么,它会在控制从那里返回后保留其值(下次输入子程序时)。

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

答案 1 :(得分:0)

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

save主要用于过程中的局部变量,以使这些变量在调用中保留其值。 fortran SAVE statement

save也可以应用于模块变量,以保证如果没有使用该模块的例程在范围内,它们就不会丢失它们的值。 Fortran 2008中不再需要这样做 - 请参阅When does a module go out of scope in Fortran 90/95?