【问题标题】:How to assign to/get value of variable at next memory address in Fortran如何在Fortran中的下一个内存地址分配/获取变量的值
【发布时间】:2019-06-03 10:05:33
【问题描述】:

我有两组全局变量,每组都存储在一个名为 common 的块中,如下所示:

integer :: x1, y1, z1, x2, y2, z2
common/vars/ x1, y1, z1
common/vars/ x2, y2, z2

我希望能够对这些变量做两件不同的事情:

  • 将每组变量的值存储在一个数组中,这样最终的结果就是integer :: a(3) = (/ x1, y1, z1 /), b(3) = (/ x2, y2, z2 /)定义的数组
  • 将第二组中的值存储在第一组的对应变量中。即:x1 = x2y1 = y2z1 = z2

但是,在实际代码中,每组中的变量多于 3 个。因此我希望能够使用循环来做到这一点。在 C/C++ 中,我可以通过递增指针轻松地做到这一点。但是,指针在 Fortran 中的工作方式不同。有没有办法做到这一点?

【问题讨论】:

  • 是的。但是请不要这样做,也请不要使用 common,这是 2019 年而不是 1978 年。相反,请告诉我们您为什么要这样做,让我们为您的问题找到一个现代解决方案。
  • 我正在对代码库进行现代化改造。相信我,我很清楚应该避免常见的块。我只是在准备使用 plusFORT 将代码库翻译成现代 Fortran。为了准备好它,我必须去掉一些等价语句(因为 plusFORT 不支持这些语句),这就是我需要这样做的原因。一旦我可以运行 plusFORT,它实际上会自动将常用块转换为模块。
  • 我已经展示了如何在 Fortran 中使用类似 C 的指针算法以及 transferstackoverflow.com/questions/50280739/… 的一点点,这并不是我推荐它或保证它是可移植的。您可以只声明数组并将标量设为指向该数组的指针。

标签: pointers fortran fortran-common-block


【解决方案1】:

不知道您的 Fortran 编译器支持什么,但这里有一些使用 DEC Fortran-77 的想法(黑客)。

  1. 类似于 EQUIVALENCE,然后将 x1 引用更改为 xyzzy.x1 等。 您可以引用数组 a() 和 b()。
STRUCTURE /MY_STRUCT/
 UNION
  MAP
    INTEGER X1, Y1, Z1, X2, Y2, Z2
  ENDMAP
  MAP
    INTEGER A(3), B(3)
  ENDMAP
 ENDUNION
ENDSTRUCTURE
COMMON /VARS/ XYZZY
RECORD /MY_STRUCT/ XYZZY
  1. 让子程序误以为您传递了一个数组(使用您的 COMMON)。可能需要编译为单独的源代码文件以避免编译器警告。
 CALL MY_SUB( X1 )
 [...]

 SUBROUTINE MY_SUB( A )
 INTEGER A(3)

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多