저는 Fortran 초보자입니다. 나는 주 프로그램에서 4 개의 인수를 취할 서브 루틴을 작성하려고하고 있는데, 처음에 전달 된 4 개의 인수가 포함 된 배열을 주 프로그램에 출력합니다.이 작업을 수행하는 좋은 방법은 무엇입니까?현명한 방법으로 Fortran 90에서 인수를 전달하십시오.
예를 들어, 아래에있는 내 테스트 프로그램에서, 나는 메인 프로그램에서 네 개의 실제 변수를 (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
를 할당 알아서해야한다는 것을 의미한다고 생각하기 때문에, 혼동을 일으킬 것으로 보인다. 서브 루틴에서 메인 프로그램으로 배열을 전송하는 더 똑똑한 방법이 있습니까? 시간 내 주셔서 감사합니다. 당신은 배열을 반환하려는 경우