首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Fortran中同时保存和通用的目的

在Fortran中同时保存和通用的目的
EN

Stack Overflow用户
提问于 2014-01-08 01:41:58
回答 2查看 1.1K关注 0票数 2

Fortran中的公共块是否具有全局变量的用途?

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

SAVE是否会将修改后的参数存储在子例程中,以供子例程以外的其他用途?

EN

回答 2

Stack Overflow用户

发布于 2014-01-08 02:06:22

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

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

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

从内存中,这意味着(这并不是真正的F77;对于概念而言):

代码语言:javascript
运行
复制
  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
EN

Stack Overflow用户

发布于 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?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20978282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档