2013-05-09 113 views
1

返回類型不匹配的話就用gfortran 4.1.2和4.8.0 gfortran編譯下面簡單的代碼: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 – 2013-05-09 05:48:37

+0

謝謝@Mark!我正在編寫一個掃描Fortran代碼並構建它們的工具,這只是一個測試。我更熟悉'module'。就我個人而言,我在我的Fortran項目的每個代碼中都加上了'implicit none',但忘記在測試中添加它!而且我還需要在程序中聲明函數'foo'。 – 2013-05-09 06:05:21

回答

0

您的代碼中存在一個錯誤,即您沒有在主程序中指定函數foo的返回類型。按照Fortran隱式打字規則,它會得到一種默認實數。你應該(1)總是使用'​​隱式無',此外如果可能的話,(2)使用模塊或包含的過程,從而給你明確的接口。

GFortran 4.1沒有報告這個錯誤的原因是老版本的GFortran總是在'過程一次'模式下運行;因此編譯器對同一文件中的任何其他函數感到高興。較新版本以「整個文件」模式工作(自4.6開始默認),編譯器一次「看到」文件中的所有過程。這允許編譯器捕獲代碼中的錯誤,並提供一些優化機會。

+0

是的,你懂了!看到我上面的評論。感謝您澄清Fortran的規則! – 2013-05-09 06:07:53