变量奇怪地在调用子程序后取值为零

时间:2011-05-31 17:04:31

标签: fortran gfortran fortran-common-block

我一直在尝试将先前使用compaq visual fortran 6.6编译的代码转换为gfortran 这是我遇到的一个具体问题: 有一个名为“et”的变量,取值为3E + 10。然后程序调用子程序。 “et”没有出现在子程序中,但在返回主程序后,它现在的值为0 当与康柏视觉堡垒相遇时,我没有遇到这个问题 我正在编写的代码是一个庞大的科学计划,因此我只将其中的一小部分放在下面:

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”保持其值)
因此,如果有人遇到过这种问题或对此有任何想法,我将非常感激

1 个答案:

答案 0 :(得分:2)

也许您有内存访问错误,例如数组边界违规,或实际和虚拟参数不匹配。子例程的接口是否显式,例如从模块“使用”?还尝试打开编译器调试选项......显然是下标检查,但其他人可能会抓到一些东西。 gfortran 4.5或4.6的广泛集合是:

-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck = all -std = f2008 -pedantic -fbacktrace

下标检查包含在fcheck = all