2016-07-01 5 views
0

Fortran 90과 Intel 컴파일러를 사용하고 있습니다. 서브 루틴에서 함수를 사용하는 것이 매우 혼란 스럽습니다. 내 코드 (나는 중요하지 않은 모든 것을 삭제)입니다 :오류 # 6404 :이 이름에는 형식이 없으며 서브 루틴에서 명시 적 형식의 함수를 사용해야합니다.

program test 
INTEGER  :: seed=5 
REAL  :: nor_ran_number1, nor_ran_number2 
CALL Box_Muller_transform(seed,nor_ran_number1,nor_ran_number2) 
end program test 

double precision function grnd(SEED) 
grnd=5 
return 
end 

SUBROUTINE Box_Muller_transform (seed,nor_ran_number1,nor_ran_number2) 
implicit none 
INTEGER, INTENT(in) :: seed 
REAL, INTENT(out) :: nor_ran_number1, nor_ran_number2 

    nor_ran_number1 = grnd(seed) 
    nor_ran_number2 = grnd(seed) 

end SUBROUTINE Box_Muller_transform 

컴파일러 반환 : 나는 this을 발견하고 함수 "대학원"가 "Box_Muller_transform"내부의 보이지 않는 것을 이해

error #6404: This name does not have a type, and must have an explicit 
type. [GRND] 
nor_ran_number1 = grnd(seed) 
------------------^ 

. 그러나는 다음 코드가 같은 오류가 발생하는 기대 :

program test 
INTEGER ::a=5, b 
call sub(a,b) 
write(*,*) b 
end program 

SUBROUTINE sub(a,b) 
INTEGER, INTENT(in)  ::a 
INTEGER, INTENT(out) ::b 
b = fun(a) 
end subroutine sub 

function fun(a) 
INTEGER  :: fun 
INTEGER  :: a 
fun   = a*a 
end function fun 

을하지만이 노력하고 있습니다. 누군가가 차이점을 지적하고이 문제를 해결하는 가장 간단한 방법을 설명하면 매우 행복 할 것입니다.

+0

모듈 내부에 함수와 서브 루틴을 배치하여 전체 호스트 오류를 ​​해결할 수 있습니다. – jlokimlin

답변

0

함수의 반환 값이 정의되어 있어야합니다. 첫 번째 예에서 implicit none을 사용하고 있기 때문에, grnd의 리턴 값의 타입은 명시 적으로 정의해야합니다 : 두 번째 예에서

SUBROUTINE Box_Muller_transform (seed,nor_ran_number1,nor_ran_number2) 
implicit none 
INTEGER, INTENT(in) :: seed 
REAL, INTENT(out) :: nor_ran_number1, nor_ran_number2 
double precision :: grnd 

    nor_ran_number1 = grnd(seed) 
    nor_ran_number2 = grnd(seed) 

end SUBROUTINE Box_Muller_transform 

, 당신 따라서 fun가 될 것으로 가정, sub에서 implicit none를 지정하지 않은 (암시 적) 유형 real입니다. 컴파일러는이를 자동으로 정수로 변환합니다.

관련 문제