Как присвоить / получить значение переменной по следующему адресу памяти в Фортране

У меня есть два набора глобальных переменных, каждый из которых хранится в именованном 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++ я мог бы сделать это легко, увеличивая указатели. Однако в Фортране указатели не работают так. Есть ли способ сделать это?

0 ответов

Не знаю, что поддерживает ваш компилятор 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. Обмани подпрограмму, думая, что вы передали массив (используя ОБЩИЙ). Может потребоваться скомпилировать как отдельный файл с исходным кодом, чтобы избежать предупреждений компилятора.
 CALL MY_SUB( X1 )
 [...]

 SUBROUTINE MY_SUB( A )
 INTEGER A(3)
Другие вопросы по тегам