递归函数运行时检查失败

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)

有人有想法吗?如果没有检查,程序就可以正常运行,除非达到递归限制。

Ale*_*ogt 5

我认为问题是

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)