【问题标题】:Localize the range of common block variables in Fortran 77本地化 Fortran 77 中常用块变量的范围
【发布时间】:2012-04-19 12:16:02
【问题描述】:

我正在编写这个 F77 代码,大量使用了 COMMON BLOCKS,这些 COMMON BLOCKS 也用于 C 程序(在名称修改之后)。如果 foo(a, b, ...) 是 fortran 代码的主要例程,是否可以将 COMMON BLOCKS 设置为 foo() 本地,以便我可以执行以下操作?

program new_control_routine()

...
call foo(a1,b1,...)
...
call foo(a2,b2,...)
...
end

关键是要对“foo”进行多次调用,每个调用都有独立公共块,即使这些块具有相同的名称。我知道的唯一方法是在“foo”的第二次调用中重命名 COMMON BLOCKS 和相关子例程,使其成为另一个例程“foo1”,所以我可以这样做:

programe new_control_routine()
...
call foo(a1,b1,...)
...
call foo1(a2,b2,...)

但这肯定是平凡且容易出错的。

【问题讨论】:

    标签: fortran fortran-common-block


    【解决方案1】:

    通用块的要点是它们是全局的,任何使用它们名称的例程都可以访问。你能在公共块数组中创建变量,并传递一个索引,以便你的不同调用访问不同的元素吗?

    为什么要限制自己使用 FORTRAN 77?使用 Fortran 95/2003,您可以创建用户定义类型并创建该类型的数组变量。然后传递要处理的元素的索引。用户定义类型可以是一组复杂的变量。该变量可以是子例程的参数或模块变量。

    【讨论】:

    • 不幸的是,这是一个遗留代码,我别无选择,只能遵循过去二十年来所做的事情。那里有数百个常见的块。并感谢您的索引想法。
    • @taki - 除非有其他用户使用您的代码,因为未知原因不愿更改,否则我认为您没有理由不能将其“升级”到更新的版本(至少 F90)。现在坚持F77,即使从保守的角度来看,也是不合理的。当图书馆升级到较新的版本时,许多用户都会受到欢迎。我不是在考虑重写,而是在缓慢引入该语言的新功能......
    • @ldigas - 谢谢。这可能是这里的人们最终会做的事情。
    • @ldigas -- 有理由坚持使用 f77。一个是,如果代码使用 f77 编译器(例如 g77)并依赖于命名约定(因为我假设这段代码确实如此,因为公共块也可以从 C 中访问)——但我同意派生类型是方式如果 f90 标准被认为是可以接受的,那么就这样做。
    • 模块变量也可以通过名称在 Fortran 和 C 之间共享。 Fortran 的 ISO C 绑定支持这一点。请参阅gcc.gnu.org/onlinedocs/gfortran/…(虽然链接指向 gfortran 文档,但此功能更通用,因为它是语言标准的一部分。)
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2015-11-19
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多