1

所以我有一个程序,里面有这样的东西:

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- 除非我非常(un),否则它不会为零幸运,所以几乎总是在制造ifail.ne.0 true

4

1 回答 1

1

我会选择将你所说的undefined variable解释为uninitialised variable。一般来说,Fortran 和许多其他编译型编程语言会很乐意使用未初始化的变量进行计算。它/它们是成年人的编程语言,如果你对这种行为进行编程,那是我们自己的事。编写使用未初始化变量的 Fortran 程序在语法上并非不正确,因此编译器不受语言标准的约束以引发警告或错误。

不过,Fortran 确实可以让您对函数和子例程进行编程,以确保给定输出参数。如果您在intent(out)过程中使用应该为它们分配值的参数的属性,那么编译器将检查是否进行了赋值,如果没有赋值则引发错误。

大多数编译器都有一个选项来实现运行时检查以使用未初始化的变量。例如,英特尔 Fortran 具有标志-check:uninit. 如果没有此检查,是的,您的程序将解释它在标记ifail为整数的内存区域中找到的任何位模式并继续。

您写道,您的函数总是以ifail == 1. 从您向我们展示的内容来看ifail,就在returnat (大概)调用结束之前readbh,无条件设置为1.

根据您对代码的披露,在我看来,它似乎ifail是一个错误返回代码,getset因此在进入该子例程时未初始化它不一定是错误的。readbh但是在返回之前将其设置为有点令人费解1

于 2013-10-01T15:09:44.013 回答