2016-12-21 2 views
1

복잡한 인수의 감마 함수를 계산하는 CERN 프로그램이 있지만 Fortran 지식 부족으로 프로그램을 실행할 수 없습니다.함수 참조가 서브 루틴을 호출 중입니다

는 I는 다음의 프로그램이 :

PROGRAM Console1 
    IMPLICIT REAL *8 (A-H,O-Z) 
    COMPLEX *16 gama,z,w 
    z=cmplx(0,0.707106781186548d0) 
    gama=cgamma(0,z,w) 
END 

SUBROUTINE cgamma(mo, z, w) 
    INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(14, 60) 
    INTEGER, INTENT(IN)  :: mo 
    COMPLEX (dp), INTENT(IN) :: z 
    COMPLEX (dp), INTENT(OUT) :: w 
... the subroutine code here 
END SUBROUTINE cgamma 

가 다음 오류

오류 # 6553를 표시 : 함수 참조 서브 루틴 서브 프로그램을 호출한다. [CGAMMA]

+0

무엇을 가지고 있습니까? .exe 또는 .so 또는 무엇? – Holmz

+0

.f90 프로그램을 추가했습니다. –

+0

'IMPLICIT NONE' 이외의'IMPLICIT'을 사용하지 마십시오. 변수가 어떻게 정의되어야하는지 서브 루틴 코드를보십시오. 'IMPLICIT REAL'을 사용하여 많은 문제를 요구하고 있습니다. –

답변

1

룩은 :

함수 참조 서브 루틴 서브 프로그램을 호출한다.

SUBROUTINE cgamma(mo, z, w) 
END SUBROUTINE 

서브 루틴 (이 경우 외부에서)를 cgamma 등을 정의한다. 프로그램에

함수로서

gama=cgamma(0,z,w) 

참조 cgamma (gama에 할당하는 결과를 리턴). 이는 오류 메시지가 참조하는 비 호환성입니다.

이 문제를 해결하려면 call 문을 사용하여 서브 루틴을 참조하거나 cgamma을 적절한 결과를 반환하는 함수로 변경해야합니다.

프로 시저 (세 가지 인수)의 디자인이 주어지면이 함수가 의도 된 것으로 기대됩니다.

+0

감사합니다. 'call cgamma' 대신 'gama = cgamma'라고 써야합니다. 도움 주셔서 감사합니다. –

1

기술적으로 프로그램이 아닙니다. 나는 아래 링크에서 문서의 일부를 다시 게시 할 것이며, 이고 매우 이라고 매우합니다. SUBROUTINE cgammaEND SUBROUTINE cgamma으로 끝납니다. 기술적으로이 파일은 포트란 프로그램이 아니며 더 큰 프로그램의 일부인 서브 루틴 일뿐입니다.

SUBROUTINE cgamma(mo, z, w) 

    IMPLICIT NONE 

! variables and code not worth posting to illustrate what is happening 

    60 w = CMPLX(w1, w2, KIND=dp) 
    RETURN 

    70 w = (0.0_dp, 0.0_dp) 
    RETURN 

    CONTAINS 

    FUNCTION rexp(x) RESULT(fn_val) 
!  extra code here, do not need to post it 
     fn_val = -1.0_dp 
     RETURN 
    END FUNCTION rexp 

END SUBROUTINE cgamma 

포트란에서 파일의 처음과 마지막 행은 PROGRAM whateverEND 될 것이다.

그래서 전체 프로그램을 가져와이 cgamma 서브 루틴을 호출하는 것을 사용하거나 보조 포트란 PROGRAM을 작성하여 cgamma 서브 루틴을 호출해야합니다. 에러 메시지에

+0

조언 해 주셔서 감사합니다. –