我只使用gfortran 4.1.2和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 :(得分:0)
您的代码中存在一个错误,即您没有在主程序中指定函数foo的返回类型。根据Fortran隐式类型规则,它因此得到一种默认的实数。
你应该(1)总是使用'implicit none',而且如果可能的话,(2)使用模块或包含的过程,从而为你提供明确的接口。
GFortran 4.1不报告此错误的原因是旧版本的GFortran始终在“一次过程”模式下运行;因此,编译器很高兴忘记了同一文件中的任何其他函数。较新的版本在“整个文件”模式下工作(默认自4.6),编译器一次“看到”文件中的所有过程。这允许编译器捕获代码中的错误,并提供一些优化机会。