如何在 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 个未定义的维度大小。这就是编译器错误消息所指的内容。如果您定义字符数组的大小,您应该能够让您的代码编译。
问题:我有一个在计算过程中创建的数组。我想把这个数组中的信息取回给主程序打印出来
例如:
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 个未定义的维度大小。这就是编译器错误消息所指的内容。如果您定义字符数组的大小,您应该能够让您的代码编译。