Fortran 中的公共块是否用于全局变量的目的?
如果是这种情况,那么这些值可以通过子程序修改吗?
将SAVE
在子程序中存储修改后的参数以供子程序内部以外的用途使用?
Fortran 中的公共块是否用于全局变量的目的?
如果是这种情况,那么这些值可以通过子程序修改吗?
将SAVE
在子程序中存储修改后的参数以供子程序内部以外的用途使用?
[编辑:我的答案基于理解问题是关于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
in one 子例程不会使该变量在其他任何地方都可以访问。然而,将会发生的是,它在控制从那里返回后(下次进入子程序时)保持其值。
最后,在 Fortran 77 之后还有更好的方法。
是的,common
创建全局变量。Fortran >=90 为此目的提供了模块变量——模块变量应该在新代码中使用而不是通用。common 增加了存储顺序通常不必要的复杂性。公共或模块变量可以被多个程序子程序和函数使用)和主程序。
save
主要用于过程中的局部变量,以使这些变量在调用之间保持其值。 fortran SAVE 语句
save
也可以应用于模块变量,以保证如果没有使用模块的例程在范围内,它们不会丢失它们的值。这在 Fortran 2008 中不再需要 - 请参阅Fortran 90/95 中的模块何时超出范围?