在 Fortran 77 代码中,有共同块和等价语句的组合使用。例如,
common /X/ a,b,c,d
dimension arr(4)
equivalent(arr(1),a)
谁能提供一个可行的解决方案,将这种 Fortran 77 代码转换为 Fortran 90 代码?
在 Fortran 77 代码中,有共同块和等价语句的组合使用。例如,
common /X/ a,b,c,d
dimension arr(4)
equivalent(arr(1),a)
谁能提供一个可行的解决方案,将这种 Fortran 77 代码转换为 Fortran 90 代码?
我假设你的意思是一个equivalence
声明。这会导致命名变量共享存储。
这可能并不容易。根据变量的使用方式,有几种可能的方法。
使用等价语句,各种变量在其对应的变量发生更改时会自动更新,因为它们占用相同的存储空间。每当b
更改a(2)
时自动更改等。每当a(3)
更改时,c
自动更改等。
您可以将所有变量变成模块变量——Fortran 90 拥有全局变量的方式。省略等效声明,它们不再共享存储。然后你可以简单地写a(2) = b
在对 的任何更改之后b
,b = a(2)
在对 的任何更改之后a(2)
等等。但这需要你识别程序中任何这些变量发生变化的每个地方,并且当程序被修改时继续遵循这种方法。这可能并不容易。
写作a(2) = b
等,假设变量是相同的类型。如果不是,则 Fortran 90 等效项equivalence
是transfer
内在函数。
根据代码对变量的作用,有两种更好的解决方案。如果程序真的用等价语句传输信息,那么看看你是否可以重写代码以只使用一组变量名。在曾经使用过的地方替换另一个名称。这只有在类型相同的情况下才有可能。
如果程序使用等价来覆盖不同时使用的变量以节省内存,那么它会更容易。在这种情况下,您可以消除等价语句并使变量成为模块变量而不是通用变量,并且无需进行额外的工作。也许它们不再是全局变量。如果一个子程序使用另一个集合,另一个使用另一个,并且公共和等价只是节省存储空间的一种方式,您可以将它们变成局部变量。
最佳解决方案取决于对特定程序的理解。
我认为是equivalence
有害的......它值得付出大量的努力来摆脱。尽管如此,如果过于深入地嵌入到一个大型程序中,它可能会非常困难。