【问题标题】:Transfer from Fortran 77 code(combination of common block and equivalence) to Fortran 90从 Fortran 77 代码(公共块和等价的组合)转移到 Fortran 90
【发布时间】:2013-06-07 03:06:51
【问题描述】:

在 Fortran 77 代码中,有共同块和等价语句的组合使用。 例如,

    common  /X/ a,b,c,d
    dimension arr(4)
    equivalent(arr(1),a)

谁能提供一个可行的解决方案,将这种 Fortran 77 代码转换为 Fortran 90 代码?

【问题讨论】:

  • 最简单的方法就是什么都不做,因为这种F77编程在F90、F2003、F2008中还是可以的……
  • 假设公共变量在内存中是连续的真的安全吗?这让我觉得它的风格很糟糕,即使它可能大部分时间都有效。
  • @george 安全。等价语句指定通用语句建立的存储顺序与数组元素的存储顺序之间的存储关联。内存中的布局是一个实现细节,但可观察的行为必须就像使用了一块连续的内存一样。
  • @IanH 谢谢 - 我看到标准中清楚地说明了这一点。
  • 如果您想用数组元素替换标量,这可能很有用:您可以(一次一个程序单元)将数组放入公共和等价(a,arr(1) ) (b,arr(2)) 等。然后开始小心地将标量替换为显式数组元素。

标签: fortran block equivalence fortran-common-block


【解决方案1】:

我假设您的意思是 equivalence 声明。这会导致命名变量共享存储。

这可能并不容易。根据变量的使用方式,有几种可能的方法。

使用等价语句,各种变量在其对应的变量发生更改时会自动更新,因为它们占用相同的存储空间。每当b 更改时a(2) 自动更改,等等。每当a(3) 更改时,c 自动更改,等等。

您可以将所有变量变成模块变量——Fortran 90 拥有全局变量的方式。省略等效声明,它们不再共享存储。然后,您可以在对b 进行任何更改后简单地写a(2) = b,在对a(2) 进行任何更改后,b = a(2) 等等。但这需要您识别程序中任何这些变量发生变化的每个位置,并且修改程序时继续沿用此方法。这可能并不容易。
a(2) = b等,假设变量的类型相同。如果不是,则 equivalence 的 Fortran 90 等效项是 transfer 内在函数。

根据代码对变量的作用,有两种更好的解决方案。如果程序真的用等价语句传输信息,那么看看你是否可以重写代码以只使用一组变量名。在曾经使用过的地方替换另一个名称。这只有在类型相同时才有可能。

如果程序使用等价来覆盖不同时使用的变量以节省内存,那么它会更容易。在这种情况下,您可以消除等价语句并使变量成为模块变量而不是通用变量,并且无需进行额外的工作。也许它们不再是全局变量。如果一个子程序使用另一个集合,另一个使用另一个,并且公共和等价只是节省存储空间的一种方式,您可以将它们变成局部变量。

最佳解决方案取决于对特定程序的理解。

我认为equivalence 是有害的......它值得付出大量的努力来摆脱。不过,如果过于深入地嵌入到大型程序中,可能会非常困难。

【讨论】:

  • 我需要更新公共块中的变量。我需要使用数组 arr 将这些变量写入文件(因为 arr 与公共块中的变量共享相同的内存空间)。这怎么能得到有效实施?
  • 如果数组只用于写入,可以在代码中替换。 write (...) arr 等价于 write (...) a, b, c, d。如果变量的长度相同,则为未格式化的写入;如果变量的类型相同,则为格式化的写入。
  • 我想出了一个方案,将公共块中的变量转换为模块中的指针变量。然后在主程序中定义一个目标数组。这样在一个模块中我定义integer,pointer ::a=>null(),b=>null(),c=>null() ,然后在主程序中定义目标数组integer,dimensions(3),target ::arr,a=>arr(1),b=>arr(2),c=>arr(3),然后使用arr将变量a,b,c写入文件。这个方案可行吗。我认为我的方案在某种意义上很糟糕。
  • 为什么您认为需要一个数组才能将变量写入文件?只需直接写定标器变量,作为“写”后的列表。如果你有大量的缩放器,我可以理解,但这可能意味着你应该有一个数组而不是缩放器变量。
  • @wirtus 是的,它可以工作,另一个问题是它是否值得作为 M.S.B.说。
猜你喜欢
  • 2013-06-27
  • 2016-12-15
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多