我是一名Fortran初学者。我正在尝试编写一个子程序,该子程序将从主程序中获取四个参数,然后输出涉及最初传入的四个参数的数组到主程序中。有什么好的/聪明的方法可以做到这一点吗?
例如,在我的下面的测试程序中,我在主程序中创建了四个实数变量(a
,b
,c
和d
)。然后,我将这些实数变量传递给名为mysub
的子程序。我希望mysub
能够接收a
,b
,c
和d
,使用它们填充名为o
的2x2数组,然后将o
发送到主程序以供显示(和可能的修改)。因此,我尝试了以下内容:
SUBROUTINE mysub(w,x,y,z)
IMPLICIT NONE
REAL, INTENT(IN) :: w, x, y, z
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: o
ALLOCATE(o(2,2))
o(1,1)=w
o(1,2)=x
o(2,1)=y
o(2,2)=z
END SUBROUTINE mysub
END MODULE testsubs
PROGRAM test
USE testsubs
IMPLICIT NONE
REAL :: a=1.1, b=2.2, c=3.3, d=4.4
CALL mysub(a, b, c, d)
PRINT *, o(1,1), o(1,2)
PRINT *, o(2,1), o(2,2)
END PROGRAM test
但是,我遇到了以下错误:
test.f90:10.53:
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: o
1
Error: Symbol at (1) is not a DUMMY variable
我理解为编译器不知道
o
是什么,因为在子程序头部的参数列表中没有o
。即SUBROUTINE mysub(w,x,y,z)
。所以我可能需要在头部包括o
。接下来,我尝试以下更改(使用!...
表示更改或添加):SUBROUTINE mysub(w,x,y,z,o) !...
IMPLICIT NONE
REAL, INTENT(IN) :: w, x, y, z
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: o
ALLOCATE(o(2,2))
o(1,1)=w
o(1,2)=x
o(2,1)=y
o(2,2)=z
END SUBROUTINE mysub
END MODULE testsubs
PROGRAM test
USE testsubs
IMPLICIT NONE
REAL :: a=1.1, b=2.2, c=3.3, d=4.4
REAL, DIMENSION(:,:), ALLOCATABLE :: o !...
CALL mysub(a, b, c, d, o) !...
PRINT *, o(1,1), o(1,2)
PRINT *, o(2,1), o(2,2)
DEALLOCATE(o) !...
END PROGRAM test
这样做似乎很好,我得到了正确的输出:
1.1000000 2.2000000
3.3000000 4.4000001
但是,我的问题是,这样做好吗?在这个工作示例中,我在子程序和主程序中都声明了数组
o
。这似乎可能会令人困惑,因为我认为这意味着我需要注意 要么 子程序 要么 主程序分配 o
(但不是同时分配,为了避免错误消息)。有没有更聪明的方法来做到这一点 - 将一个数组从子程序发送到主程序?感谢您的时间。