Ошибка проверки времени выполнения в рекурсивной функции

Когда я компилирую свою программу с проверками во время выполнения, я получаю следующую ошибку (и я понятия не имею, почему):

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 

Код:

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

У кого-нибудь есть идея? Без проверки программа работает нормально, если я не достигну предела рекурсии.


person PeMa    schedule 30.06.2014    source источник
comment
Мой ifort дает значение 20100 без сбоев (версия 14 для Windows). Gfortran дает такое же значение, а Abosft 2014 не может скомпилировать (поскольку он хочет, чтобы lambda_i была объявлена ​​внешней, хотя это внутренняя функция). Если я экстернализую lambda_i, я все равно получу 20100.   -  person    schedule 30.06.2014


Ответы (1)


я думаю проблема в том

if ( n .ge. 0 ) s=f(n)+my_sum(f,i,n-1)

Как только вы достигаете n .lt. 0, возвращаемое значение s не определено, и функция возвращает неопределенную переменную (точно так же, как жалуется ifort). Поскольку это последний шаг вашей рекурсии, и все остальные результаты зависят от него, общий результат не определен.

Этого можно избежать, используя

if ( n .ge. 0 ) then 
  s=f(n)+my_sum(f,i,n-1)
else
  s=0._8
endif
person Alexander Vogt    schedule 30.06.2014
comment
Вы, конечно, правы, но забавно, что вы получаете одно и то же значение с тремя компиляторами. И это также значение, которое вы получите, если установите s=0 в предложении else, которое вы предлагаете. То есть все они как бы инициализируются нулем. - person ; 30.06.2014