2

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

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

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

4

1 回答 1

3

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

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

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

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

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

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

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

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

于 2013-06-07T04:40:36.550 回答