我是Fortran新手。我正在嘗試編寫一個子程序,它將從主程序中取出四個參數,然後向主程序輸出一個數組,該數組涉及最初傳入的四個參數。什麼是一個好的/聰明的方法來執行此操作?聰明的方式在Fortran中傳遞參數90
例如,在我下面的測試程序,我創建了四個實變量(a
,b
,c
和d
)在主程序中。然後我將這些實際變量傳遞給一個名爲mysub
的子程序。我希望mysub
能夠接受a
,b
,c
和d
,使用它們填充名爲o
的2乘2陣列,然後將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
(但不既,我認爲,爲了避免錯誤消息)。有沒有更聰明的方法來做到這一點 - 從子程序發送數組到主程序?感謝您的時間。