Различия в компиляторе Фортрана в отношении свойств к "атрибутам сохранения"?

У нас есть этот старый скрипт на Фортране, который мы пытаемся перекомпилировать с использованием Intel Fortran, но мы получаем ошибки в вычислениях и результаты, отличные от старой скомпилированной версии кода.

Мы нашли то, что, по нашему мнению, является проблемой в коде ниже (который в общих чертах взят из Числовых Рецептов).

Проблема в том, что параметр 'it' сбрасывается для каждого вызова, однако его следует сохранять между вызовами функций.

Наша лучшая догадка о том, в чем может быть проблема, заключается в том, что более старый компилятор мог рассматривать "это" как "атрибут сохранения" и, следовательно, сохранять его между вызовами функций.

Мы можем быть совершенно не правы, и если какой-то фортран-гуру может подтвердить это или получить лучшее объяснение, мы будем рады некоторой помощи!

      subroutine TrapezoidalRule(Func, a, b, s, n)
*
*     This routine performs the trapezoidal rule, see Numerical Recipes
*
      implicit none
      real*8 Func, a, b, s
      Integer*4 n
      external Func
*
      real*8 del, x, sum
      Integer*4 it, tnm, j
*
      if (n .eq. 1) then
*
         s=0.5d0*(b-a)*(Func(a)+Func(b))
         it=1
*
      else
*
         tnm=it
         del=(b-a)/dble(tnm)
         x=a+0.5d0*del
         sum=0.d0
         do 11 j=1,it
*
            sum=sum+Func(x)
            x=x+del
*
11       continue
*
         s=0.5d0*(s+(b-a)*sum/dble(tnm))
         it=2*it
*
      endif
*
      return
      end

1 ответ

Решение

Да, объяснение правдоподобно. Код обращается к переменной it в

   tnm=it

и это значение не определено, когда it не является save,

Старая компиляция, возможно, вообще не использовала стек и могла использовать статическое хранилище для всех переменных. Он также мог использовать стек, но он никогда не перезаписывался, и значение оказалось в том же месте. Кто знает, у нас нет информации, чтобы знать.

Есть опции компилятора, чтобы заставить save атрибут для всех переменных для плохих кодов, как это (SAVE для всех никогда не было стандартным!). Просто -save для Intel Fortran.

Другие вопросы по тегам