回 帖 发 新 帖 刷新版面

主题:[讨论]fortran 77 中if 内部例程出错,急

各位大侠,我一个F77编写的程序,运行到

      DO IJ=1,NOPTS
      IF ( CDNAME .EQ. OPTION(IJ)) GOTO( 6000, 1000, 2000, 3000,8000,
     &  4000,8500),IJ
      ENDDO

===================================================================
出现错误:
    "GDYN2S.f", Line = 50142, Column = 1: 内部: 在例程cif_message_rec的条件语句中选择  DEFAULT 条件。将无法运行到此处。[color=808000][/color]

 其中, Line = 50142是指的IF ( CDNAME .EQ. OPTION(IJ)) GOTO( 6000, 1000, 2000, 3000,8000,

====================================================================

  这到底是怎么回事,怎么修改,才能避免这样的错误。我已经对它研究了一个星期,也没有找到解决的办法,请教各位大侠,在此多谢啦。


回复列表 (共40个回复)

沙发

CDNAME和OPTION是啥類型?

板凳

多谢cgl_lgs,这两个变量是如下定义的:

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
      DIMENSION FIELD(4),OPTION(7)
      CHARACTER(8)      :: CDNAME
      CHARACTER(8)      :: OPTION

      DATA OPTION/'ACCLRM','ACCBIA','      ','DYNSEL','SURFRC',
     &            'ENDACC','AXES  '/
。。。
      READ(IUNT50,71000,END=60000) CDNAME,IC78,IC910,IC1112,IC1314,
     &   IC1517,IC1824,FIELD
。。。

     71000 FORMAT(BZ,A6,4I2,I3,I7,D20.8,D15.3,D13.1,D8.2)

3 楼

OPTION只初始化了6個,最后一個將走不到。
這個應該是個Warning吧。

4 楼


多谢cgl_lgs,OPTION是定义了7个,也初始化了七个,其中有一个是空的,“      ”。
这个程序是很老的一个程序,应该是fortran66写的,我编译的时候用的是f90,是不是因此我编译器不合适而出现内部错误,如果是这样,最坏的方法是把这个程序改成fortran90的吗?除此之外还有别的方法吗

5 楼

90基本兼容77,除極個別情況。
不過可以把這個goto改改是真的:)

6 楼

呵呵,cgl_lgs,可是我有点搞不清楚,对于下面这个语句,
===============================================
 IF ( CDNAME .EQ. OPTION(IJ)) GOTO( 6000, 1000, 2000, 3000,8000,
     &  4000,8500),IJ
 ==============================================
 您认为怎么改比较合适?[em40]

7 楼

這東東要改確實還是挺麻煩的,或是改為select case,又或是if...elseif....elseif....再或是用行號變量來代替~~~~
總之先小改動試試吧:)

8 楼

或許根本原因根本就不是這兒也沒準兒:)

9 楼


那我就试试IF ELSEIF吧,但愿问题是出在这里,否则又不知道从哪里下手了。

10 楼

cgl_lgs,还得请教您,我把这段程序改为了if ...else if 格式,然后在 go to 2000这个地方有出现了相同的错误提示。如果将2000改为3000,则无错误,但程序结果就不对了,其实2000代表的是一个continue

DO IJ=1,NOPTS
       IF(CDNAME.EQ.OPTION(IJ)) THEN
         IF (IJ .EQ. 1) THEN 
             GOTO 6000
          ELSE IF (IJ .EQ. 2) THEN
              GO TO 1000
              ELSE IF (IJ .EQ. 3) THEN
                 GO TO 2000          *出错行,如果将2000改为3000,***则无错误
               ELSE IF (IJ .EQ. 4) THEN
                   GO TO 3000
                   ELSE IF (IJ .EQ. 5) THEN
                       GO TO 8000
                   ELSE IF (IJ .EQ. 6) THEN
                         GO TO 4000
                       ELSE IF (IJ .EQ. 7) THEN
                           GO TO 8500
         END IF
       END IF
  ENDDO

2000后紧跟的程序
* ********************************************************************
2000  CONTINUE

      READ(IUNT50,71000,END=60000) CDNAME,IC78,IC910,IC1112,IC1314,
     &     IC1517,IC1824,FIELD

我来回复

您尚未登录,请登录后再回复。点此登录或注册