2017-09-19 6 views
1

저는 Fortran을 처음 접하고 다음과 같은 것이 가능한지 이해하려고합니다. 프로그램을 구조화하기위한 나의 아이디어는 하나의 모듈에 정밀도와 변수 타입을 선언하는 것이다. 그런 다음 다른 모듈 또는 주 프로그램의 유형을 다시 선언하지 않고 이러한 변수를 사용하십시오.정밀도와 전역 변수 유형을위한 포트란 링크 모듈

gfortran -c mod_pre.f90 
gfortran -c mod_hon.f90 
:

module hon 
use pre 
implicit none 

contains 
    function KE(H,M) result(KR) 
     KR = 2*PI/H/M 
    end function KE 
end module hon 

가 그럼 난 순서로 gfortran을 사용

module pre 
implicit none 

    INTEGER, PARAMETER  :: sp=SELECTED_REAL_KIND(6,37) 
    INTEGER, PARAMETER  :: dp=SELECTED_REAL_KIND(15,307) 
    INTEGER, PARAMETER  :: qp=SELECTED_REAL_KIND(33,4931) 

    REAL(dp), PARAMETER  :: pi = 4.*ATAN(1.) 
    REAL(dp)    :: H        
    REAL(dp)    :: M 
    REAL(dp)    :: KR 

end module pre 

는 지금과 같은 하나 개 이상의 기능을 포함하는 다른 모듈에있는 모든 변수의 사용을 만들고 싶어

'module pre'는 'module hon'의 일부이므로 순서대로 컴파일하지만 gfortran은 오류를 표시합니다.

위의 코드를 사용하면 변수 유형 및 매개 변수가 USE에 포함되어야한다는 것을 알았습니다. 그러나 내가받은 메시지는 gfortran에서 'module hon'를 컴파일하려고 할 때 내 변수 중 IMPLICIT 타입이 없다는 것입니다.

누군가가 문제를 명확히하거나 해결책을 제안 할 수 있습니까? 내 변수가 여러 모듈에 분산되는 것을 피하고 싶습니다.

감사합니다.

답변

0

function 문에서 result(kr)은 함수 결과의 이름이 kr이라고 말합니다. 이 함수 결과는 모듈 변수 kr과 같은 결과가 아닙니다. 특히이 함수 결과는 모듈 변수에 액세스 할 수 없게 만듭니다.

함수 결과는 함수 자체에 고유하며 해당 특성은 함수 서브 프로그램 내에서 선언되어야합니다.

마찬가지로 함수의 더미 인수 (HM)는 모듈 변수와 구별되며 함수 서브 프로그램에서 선언해야합니다.

그 외에도 아마도 other question과 비슷한 문제가있을 수 있습니다.

명확하게 말하면 "kr이라는 모든 함수 결과 및 H 또는 M이라는 모든 가짜 인수는 이러한 특성을 가지고 있습니다"와 같은 것을 말할 수 없습니다. 각 개별 객체에는 속성이 제공되어야합니다. 파일이 선언을 가지고

function ke(H, M) result (kr) 
    include 'resdummydecls' 
    ... 
end function 

:

그러나, 나는이 추천하지 않지만,이 문자 텍스트 포함 (파일 프리 프로세서를 사용하거나 포함)이 당신을 도울 수있는 상황이다.

+0

안녕하세요, francescalus, 저와 함께하시기 바랍니다. 그런 다음 변수 유형을 선언하고 해당 모듈을 다른 모듈에 사용하는 데는 아무런 쓸모가 없습니까? 예를 들어 결과 'kr'은 항상 실수 (dp)와 나머지 입력 변수입니다. 이것은 단지 한 번만 정의하는 대신 모든 단일 모듈에서 'H'또는 다른 모듈을 선언해야 함을 의미합니다. – musi

+0

예제에서 sp, dp 및 qp는 다음과 같이 사용할 수 있습니다. 함수 종류를 정의하는'real (kind = dp) :: ke'입니다. @francescalus가 언급 한 * 변수 *'kr'는 지역 변수로 다시 정의됩니다. 지역 범위'kr '가 정의되지 않은 경우 모듈 범위'kr '이 사용됩니다. –

+0

안녕하세요, 귀하의 답변을 주셔서 감사합니다, 나는 해결책을 찾았고 내가 찾은 유일한 방법은 함수 내부의 변수를 재정의하는 것입니다. 이제 변수에 대한 REAL (4)에서 REAL (8)로 넘어가는 gfortran 상태의 함수에 관한 다른 문제에 직면하고 있습니다. 나는 시작하기가 약간 어렵다. 이 문제를 극복 할 수있는 방법이 있습니까? – musi