Fortran中的公共块是否具有全局变量的用途?
如果是这种情况,那么子例程可以修改这些值吗?
SAVE
是否会将修改后的参数存储在子例程中,以供子例程以外的其他用途?
发布于 2014-01-08 02:06:22
编辑:我的答案是基于这样的理解,即问题是关于公共块上的SAVE
,而不是局部变量(即,作为COMMON
的替代)。否则,请参阅cup的评论。
在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之后还有更好的方法。
发布于 2014-01-08 12:59:40
是的,common
创建全局变量。Fortran >=90为此提供了模块变量--在新代码中应该优先使用模块变量,而不是公共变量。common增加了通常不必要的存储顺序的复杂性。公共或模块变量可以由多个过程子例程和主程序使用。
save
主要用于过程中的局部变量,以使这些变量在调用过程中保留它们的值。fortran SAVE statement
save
还可以应用于模块变量,以保证在没有使用模块的例程在作用域中时,它们不会丢失它们的值。这在Fortran 2008中不再是必需的--参见When does a module go out of scope in Fortran 90/95?
https://stackoverflow.com/questions/20978282
复制相似问题