【发布时间】:2013-10-07 18:50:13
【问题描述】:
所以我有一个程序,里面有这样的东西:
integer :: mgvn, stot, gutot, iprint, iwrit, ifail, iprnt
...
call readbh(lubnd,nbset,nchan,mgvn,stot,gutot,nstat,nbound,rr,bform,iprnt,iwrit,ifail)
然后在readbh里面:
CALL GETSET(LUBND,NSET,KEYBC,BFORM,IFAIL)
IF(IFAIL.NE.0) GO TO 99
...
99 WRITE(IWRITE,98) NBSET,LUBND
IFAIL = 1
RETURN
所有其他变量都已定义,但 ifail 未定义。如果我在函数调用之前添加write(*,*) ifail,我会得到未定义的变量错误,但如果我把它排除在外,它不会抱怨,只是与函数一起跑掉,总是失败,IFAIL=1。
这是因为它刚刚到达 readbh 函数中参数的末尾,读取未初始化的内存 - 这只是随机的乱码 - 然后将这些位转换为 int - 这不会零,除非我很(不)幸运,所以几乎总是让ifail.ne.0true?
【问题讨论】:
-
您是没有定义 ifail 还是将其从调用 arg 列表中删除?访问未定义的变量就是未定义的。它可能为零,或者可能是该内存位置中发生的任何垃圾。如果您在子例程中访问甚至没有提供的 args,您可能会遇到段错误。
-
-Wuninitialized标志是有原因的...