Переменная странным образом принимает значение ноль после вызова подпрограммы

Я столкнулся с некоторыми проблемами, пытаясь преобразовать код, предварительно скомпилированный с compaq visual fortran 6.6, в gfortran.
Вот конкретная проблема, с которой я столкнулся в gfortran:
Существует переменная с именем "et", которая принимает значение 3E+10. Затем программа вызывает подпрограмму. "et" не появляется в подпрограмме, но после возврата в основную программу она теперь имеет значение 0.
При компиляции с compaq visual fortran у меня не было этой проблемы.
Код, над которым я работаю, - это огромная научная программа, поэтому ниже я приведу лишь небольшую ее часть:

c
c     calculate load/unload modulus
c
500   t=(s1-s3)/2.
      aa=1.00
      if(iconeps.ne.1)bb=1.00
      if(smean.lt.ap1) smean=ap1
      if(xn.gt.0.000001) aa=(smean/atmp)**xn
      if(iconeps.eq.1)go to 220
      if(xm.gt.0.000001) bb=(smean/atmp)**xm
220   if(t.ge.0.99*sm1) go to 600
      et=xku*aa*atmp+tt*tm1
      if(iconeps.ne.1)bt=xkb*atmp*bb
      go to  900
600   et=(xkl*aa*atmp+tt*tm1)*(1.0-rf*sr)**2
      if(iconeps.ne.1)bt=xkb*atmp*bb
900   continue
      btmax=17.0*et
      btmin=0.33*et

      if(iconeps.ne.1)then
      tbt=(alf1+alf3*dtt)*dtt*(1.+vide)*tm2
      btf=bt+tbt
      bt=btf
      endif

      if(bt.lt.btmin) bt=btmin
      if(bt.gt.btmax) bt=btmax
      if(iconeps.eq.1)go to 1100

1000  continue

1050  if(mt.eq.mtyp4c)goto 1100
      s=0.0
      t=0.0
      call shap4n(s,t,f,pfs,pft)                           ! Modification by NHV
      call thick4n(s,t,xe,ye,thick)
      call bmat4n(xe,ye,f,pfs,pft,b,detj,thick)

c     calculate incremental strains

      do 1300 i=1,4
      temp=0.0
      do 1200 j=1,8
1200  temp=temp+b(i,j)*disp(j)
1300  depi(i)=temp
      epsv=0.0
      do 1400 i=1,2
1400  epsv=epsv+depi(i)
  epsv=epsv+depi(4)

      ev=vide-(1.+vide)*epsv

      if(ev.lt.0.0)ev=vide*.01

1100  continue

      call perm(permws,xkw,coef,rw,tvisc,ev,vide,tt,pp)

: "et" сохраняет правильное значение до вызова подпрограммы "perm". Сразу после этой подпрограммы она принимает значение ноль.
"et" не входит ни в один общий блок
Этот фрагмент кода является частью подпрограммы, вызываемой несколькими различными подпрограммами. Что еще более странно, это то, что когда он вызывается в других частях кода, у меня нет этой проблемы ("et" сохраняет значение)
Так что, если кто-то когда-либо сталкивался с такой проблемой или имеет какое-либо представление о ней, я буду очень благодарен

2 ответа

Решение

Возможно, у вас есть ошибка доступа к памяти, например, нарушение границ массива или несоответствие между фактическими и фиктивными аргументами. Являются ли интерфейсы подпрограмм явными, например, "используются" из модуля? Также попробуйте включить параметры отладки компилятора... очевидно, проверку подписки, но другие могут что-то поймать. Обширный набор для gfortran 4.5 или 4.6 это:

-O2 -fimplicit-none -Wall -Wline-усечение -Wcharacter-усечение -Wsurprising -Waliasing -Wimplicit-interface -Wunused-параметр -fwhole-file -fcheck= все -std=f2008 -pedantic -fbacktrace

Проверка нижнего индекса включена в fcheck=all

У меня была эта проблема. В моей основной программе я использовал двойную точность, но числа, которые я вычислял в своей подпрограмме, были одинарной точностью. После того, как я изменил их на двойные, это решило проблему, и я получил фактические значения вместо 0.

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