如何在 Fortran 77 中交换虚拟变量?

How to Interchange dummy variables in Fortran 77?

问题:我有一个在计算过程中创建的数组。我想把这个数组中的信息取回给主程序打印出来

例如:

 PROGRAM DRIVER
  CHARACTER A(*)*(*),B(*)*(*)

  CALL TEST1(A,B)

  write(*,*) 'Print B  ', B


  END

  SUBROUTINE TEST1(A,B)
  CHARACTER A(*)*(*),B(*)*(*)

  A(1)='APPLE'
  A(2)='BAT'

  B(1:2)=A(1:2)


  END

上面的程序中,在"SUBROUTINE TEST1"中创建了数组A,不知道A的长度,想通过'B'取回'A'中的信息并打印。

当我编译上面的程序时,出现以下错误。

gfortran -c -O4 -mcmodel=medium -fno-automatic -std=legacy -z muldefs -ff2c -frepack-arrays -fall-intrinsics   Test.f
Test.f:2.24:

      CHARACTER A(*)*(*),B(*)*(*)                                       
                        1
Error: Assumed size array at (1) must be a dummy argument
Test.f:2.33:

      CHARACTER A(*)*(*),B(*)*(*)                                       
                                 1
Error: Assumed size array at (1) must be a dummy argument
Test.f:6.29:

      write(*,*) 'Print B  ', B                                         
                             1
Error: The upper bound in the last dimension must appear in the reference to the assumed size array 'b' at (1)
Test.f:6.72:

      write(*,*) 'Print B  ', B                                         
                                                                        1
Error: Data transfer element at (1) cannot be a full reference to an assumed-size array
make: *** [Test.o] Error 1

在 C/C++ 和 Fortran 中,您可以将“假定大小”的数组传入和传出 functions/subroutines。这是因为数组包含一个内存块的地址。然后程序使用起始地址和数组索引值计算该数组中元素的内存地址。如果你有一个多维数组,你需要知道除了一个维度之外的所有维度的步长。假设您有一个二维数组。如果您知道 x 轴的长度为 20 个元素,那么 y 可以是未定义的大小,但您始终可以计算 (x,y) 位置的内存地址。地址 = 20 * y + x。作为一般规则,变化最慢的索引是可以是未定义大小的索引。在我的示例中,这是 y 轴。在您的代码中,您使用的是字符数组的数组。这意味着您有 2 个未定义的维度大小。这就是编译器错误消息所指的内容。如果您定义字符数组的大小,您应该能够让您的代码编译。