2015-01-07 2 views
4
포트란 90로 자유 형식의 새가되는

, 코드의 다음 조각이 작동하지 왜 난 정말 알고 싶습니다 :포트란 배열은 함수에서 반환 할 수 없습니다하지 않는 더미 변수

program test2 
    implicit none 
    !!! A program to practice f90 writing. 
    ! Define double precision data 
    integer, parameter :: dp = kind(1.d0) 
    real(dp) :: a(3), b(3) 
    integer :: i 
    a = (/(i, i=1, 3)/) 
    b = (/(i, i=1, 3)/) 
    write (*, *) m31tensorprod(a, b) 

contains 
    function m31tensorprod(a, b) 
     real(dp), dimension(3), intent(in) :: a, b 
     real(dp), intent(out) :: m31tensorprod(3, 3) 
     integer :: k1, k2 
     forall(k1=1:3, k2=1:3) 
      m31tensorprod(k1, k2) = a(k1) * b(k2) 
     end forall 
     return 
    end function m31tensorprod 
end program test2 

I gfortran test2.f90를 통해이 문제를 컴파일하려고, 그것은 말한다 :

test2.f90 : 13.4 :

function m31tensorprod(a, b) 
1 Error: Symbol at (1) is not a DUMMY variable 

나는 m31tensorprod가 내부 함수이기 때문에 그것을 선언 할 필요가 없다고 생각했다. 나는 어디에서 잘못 했는가?

덕분에,

+1

인 텐트 (out)은 결과에 적합하지 않습니다. 자세한 내용은 http://stackoverflow.com/q/24170024/3157076을 참조하십시오. – francescalus

+0

@francescalus 답변 해 주셔서 감사합니다. 나는 언급 된 질문에 갔다. 그 뜻은 : 변수'function_name'에 대해서는 아직 메모리에 할당 된 주소가 없으므로 출력 주소를 가리키는 더미 변수가 아닙니다. 따라서 '의도 (out)'는 불법입니다. 그게 맞습니까? –

+0

"Dummy"는 함수에 대한 인수를 의미합니다. 이 경우'a'와'b'_in_ 함수가 있습니다. 의도는 더미 변수에 대해서만 지정할 수 있습니다. – francescalus

답변

6

당신은 m31tensorprod은 내부 함수 인 것은 메인 프로그램에서 선언 할 필요가 없다는 것을 의미하는 것이 정확합니다. 특수 용어에는 명시적인 인터페이스가 있습니다.

그러나 코드에는 문제가 없습니다. 잘못된 것은 함수 정의 그 자체입니다. [시피 컴파일러 메시지도 유용하지 않다.]

함수 서브

function m31tensorprod(a, b) 

의 정의하면m31tensorprod 변수 결과 함수를 정의한다. 이 결과 변수에 선언이 적용됩니다.

real(dp), intent(out) :: m31tensorprod(3, 3) 

이 선언은 잘못되었습니다. 유형 (real(dp))과 크기 ((3,3))를 선언 할 수 있지만 intent(out)은 잘못된 것입니다.

intent 속성은 Fortran standard의 즉, 제약 (C538)을 따르는

더미 데이터 객체 또는 더미 절차 포인터한다 의도 속성 엔티티.

컴파일러 메시지로 돌아 오면 m31tensorprod은 더미 변수가 아닙니다. 이 경우 더미 인수는 ab입니다. 일반적으로 가짜 인수는 () 사이의 것입니다.

관련 문제