2014-09-15 2 views
2

VS 모듈 루틴 인수 의도 Confusion- INOUT는 벡터가 말하게 (dpmaxn 함께) 초기 루틴에 값을 할당하고, 메인 프로그램에서 호출포트란 OUT

REAL(KIND=dp), DIMENSION(maxn) :: rho 

.

그러면 주 프로그램이 rho으로 진화하기 위해 (다른) 서브 루틴을 포함하는 모듈을 호출합니다. rho위한 서브 루틴 인자는 다음과 같이 정의된다 :이 서브 루틴 (ρ)에

SUBROUTINE sum_density(a, b, c, ....., rho) 

가 선언된다

REAL(KIND=dp), DIMENSION(maxn), INTENT(OUT) :: rho 

그러나 코드는 다음 라인, 어떤 값에 앞서이 rho와 연관되고 포함

foo1= foo2*foo3(i)/rho(i) 

모듈 서브 루틴이 주 프로그램에 정의 된 rho에 액세스하지 못했을 것이라고 생각했을 것입니다. 컴파일러가 불만을 제기하고 (INOUT)으로 변경하거나 rho과 같은 것을 정의 할 것을 기대합니다. 비록 내가 그것을 (INOUT)으로 바꾸더라도 결과에 차이가 없습니다. 모듈 서브 루틴은 주 프로그램에서 rho의 값에 액세스하고 인 텐트가 OUT으로 선언 되더라도 사용해야합니다.

내 질문은 -이 시나리오에서 INTENT(OUT)INTENT(INOUT) 사이의 차이점은 무엇입니까?

+2

정말 당신을 했

이 코드를 고려 마지막 문장에서 '의도 (IN)'를 의미합니까? –

+0

죄송합니다. 지적 해 주셔서 감사합니다. - 수정 – 1QuickQuestion

답변

3

INTENT(OUT)은 정의되지 않은 값을 가진 배열을 액세스하기 때문에 프로그램이 표준을 따르지 않습니다.

그러나 명시 적 모양 배열이 일반적으로 구현되는 방식 (배열의 주소 전달)으로 인해 소프트웨어 구현이 제대로 작동 할 수 있습니다. 당신이 전달 된 배열이 비 연속 인 경우, 배열이 intent(out)와 쓰레기를 포함 할 수 있기 때문에 이제, 컴파일러가 전달 사본을 만들 가능성이 높습니다하고 문제가 발생할 가능성이

rho(::2) 

가정 해 봅시다.

경고와 관련해서는 반드시 준수해야하는 것은 아니지만 컴파일러는 -warn 또는 -Wall과 같은 플래그를 사용하면 이에 대해 경고합니다.

intent(in)의 경우 rho을 수정하려고하면 차이가 발생합니다. 컴파일러가 오류를 발행해야하는 경우. 범위에 대해

: 여기 범위에 대해 이야기 정말 정확하지

는 원래 rho이 서브 루틴의 범위에 확실히입니다 만 더미 인수입니다. 같은 이름의 재사용은 아마도 혼란 스럽습니다. 프로그램에서 실제로는 rho1, 서브 루틴에서는 rho2이라고 상상해보십시오. 그렇다면 rho1은 서브 루틴의 범위에 없지만 rho2은 분명합니다.

이제 rho2intent(out)와 서브 루틴의 시작 rho1와 같은 값이 보장되지 않습니다 있지만 intent(inout)으로이 보장됩니다. 그 이유는 인수 전달이 copy-in 및 copy-out을 사용하여 구현 될 수 있고 copy-in이 intent(out)에 대해 생략 될 수 있기 때문입니다. 하나는 예상대로 쓰레기를 인쇄하지만 다른 사람과 또는 일부 컴파일러 매개 변수, 그것은 4 회 한 인쇄 일부 컴파일러로

module m 
contains 
    subroutine sub(a2) 
    real, intent(out) :: a2(4) 
    print *,a2 
    a2 = 2 
    end subroutine 
end 

    use m 

    real :: a1(8) 

    a1 = 1 

    call sub(a1(::2)) 

end 

:

sunf90 intent2.f90 
./a.out 
5.879759E-39 0.0E+0 0.0E+0 0.0E+0 
+0

답변 해 주셔서 감사합니다. (질문의 마지막 문장에서 오타를 지적 해주십시오.) 의도가 OUT으로 선언 된 경우 원래 ρ가 모듈의 범위를 벗어나는 경우 명확하게 설명해주십시오. 명시 적 쉐이프 배열이 구현되는 방식으로 인해 범위에 포함된다는 말입니까? – 1QuickQuestion

+1

최초로 선언 된'rho'는'intent'가 무엇이든 관계없이 모듈 프로 시저의 범위에서 _never_입니다. 그러나 이와 연관된 메모리는 모듈 프로 시저의 더미 인수와도 연관됩니다. – bdforbes