PeM*_*eMa 1 recursion fortran runtime intel-fortran
当我使用运行时检查编译程序时,出现以下错误(我不知道为什么):
ifort -check all test.f90 -o test
./test
forrtl: severe (193): Run-Time Check Failure. The variable 'my_sum$2$_2' is being used without being defined
Image PC Routine Line Source
sum 0000000000403098 Unknown Unknown Unknown
sum 0000000000403098 Unknown Unknown Unknown
sum 0000000000403098 Unknown Unknown Unknown
sum 0000000000403098 Unknown Unknown Unknown
.
.
.
sum 0000000000403098 Unknown Unknown Unknown
sum 0000000000402EAF Unknown Unknown Unknown
sum 0000000000402DE6 Unknown Unknown Unknown
libc.so.6 00007F7FEB268BE5 Unknown Unknown Unknown
sum 0000000000402CD9 Unknown Unknown Unknown
Run Code Online (Sandbox Code Playgroud)
代码是:
program test
implicit none
real(8) :: x
x=my_sum(lambda_i,0,200)
print*,x
contains
function lambda_i(n) result(i)
real(8) :: i
integer,intent(in) :: n
i=dble(n)
end function
recursive function my_sum(f,i,n) result(s)
implicit none
real(8) :: s
integer, intent(in) :: i,n
interface
function f(n)
implicit none
real(8) :: f
integer,intent(in) :: n
end function
end interface
if ( n .ge. 0 ) s=f(n)+my_sum(f,i,n-1)
end function
end program
Run Code Online (Sandbox Code Playgroud)
有人有想法吗?如果没有检查,程序就可以正常运行,除非达到递归限制。
我认为问题是
if ( n .ge. 0 ) s=f(n)+my_sum(f,i,n-1)
Run Code Online (Sandbox Code Playgroud)
一旦到达n .lt. 0,返回值s就没有定义,并且函数返回一个未定义的变量(就像ifort抱怨一样)。由于这是递归的最后一步,并且所有其他结果都依赖于此,因此总结果是未定义的。
这可以通过使用来避免
if ( n .ge. 0 ) then
s=f(n)+my_sum(f,i,n-1)
else
s=0._8
endif
Run Code Online (Sandbox Code Playgroud)