Fortran中的公共块是否适用于全局变量?
如果是这种情况,那么可以通过子程序修改这些值吗?
SAVE
是否会在子程序中存储修改后的参数,以用于子程序以外的用途?
答案 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?