我有两组全局变量,每组都存储在一个命名的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 = x2
、y1 = y2
和z1 = z2
。
但是,在实际代码中,每个集合中的变量远不止 3 个。因此,我希望能够使用循环来做到这一点。在 C/C++ 中,我可以通过增加指针轻松做到这一点。但是,指针在 Fortran 中的工作方式并非如此。有什么办法可以做到这一点吗?
不知道你的Fortran编译器支持什么,但这里有一些使用DEC Fortran-77的想法(技巧)。
- 与 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
- 愚弄一个子例程,认为你已经传递了一个数组(使用你的 COMMON)。可能需要编译为单独的源代码文件以避免编译器警告。
CALL MY_SUB( X1 ) [...] SUBROUTINE MY_SUB( A ) INTEGER A(3)