2013-05-09 1 views
1

의 반환 형식이 일치 난 그냥 다음과 같은 간단한 코드를 컴파일 할 gfortran 4.1.2 및 gfortran 4.8.0을 사용gfortran 4.8.0 버그? 기능

function foo(a, b) result(res) 

    integer, intent(in) :: a, b 
    integer res 

    res = a+b 

end function foo 

program test 

    integer a, b, c 

    c = foo(a, b) 

end program test 

gfortran 4.1.2 성공을하지만, gfortran 4.8.0은 이상한 오류가 있습니다 :

test.F90:14.11: 

    c = foo(a, b) 
      1 
Error: Return type mismatch of function 'foo' at (1) (REAL(4)/INTEGER(4)) 

아이디어가 있으십니까?

+0

http://stackoverflow.com/questions/16446397/data-type-mismatch-in-fortran#comment23592695_16446397 –

+0

고맙습니다. @ 마크! Fortran 코드를 스캔하고 빌드하는 툴을 작성하고 있습니다. 이것은 테스트 일뿐입니다. 그리고 저는'모듈 '에 대해 더 잘 알고 있습니다. 개인적으로 필자는 Fortran 프로젝트의 모든 코드에'implicit none '을 추가했지만, 테스트에 추가하는 것을 잊어 버렸습니다! 그리고 프로그램에서'foo' 함수를 선언해야합니다. –

답변

0

코드에 버그가 있습니다. 즉, 주 프로그램에서 함수 foo의 반환 형식을 지정하지 않았습니다. 포트란 암시 적 타이핑 규칙에 따라 기본 유형의 실제를 얻습니다.

(1) 항상 '암시 적 none'을 사용해야하며, 가능하다면 (2) 모듈 또는 포함 된 절차를 사용하여 명시적인 인터페이스를 제공해야합니다.

GFortran 4.1이이 오류를보고하지 않는 이유는 이전 버전의 GFortran이 항상 '프로 시저를 한 번에'모드로 작동했기 때문입니다. 따라서 컴파일러는 같은 파일에있는 다른 함수를 기꺼이 무시하지 않습니다. 최신 버전은 컴파일러가 한 번에 파일의 모든 프로 시저를 '볼'하는 '전체 파일'모드 (기본값 4.6 이후)에서 작동합니다. 이를 통해 컴파일러는 코드에있는 것과 같은 오류를 catch 할 수 있으며 최적화 기회도 얻을 수 있습니다.

+0

네, 가지고 있어요! 위 내 의견을 참조하십시오. Fortran의 규칙을 명확히 해 주셔서 감사합니다! –