fortran - 适用于非常旧的代码的 ifort 方言选项

标签 fortran goto intel-fortran

我突然得到了一些非常旧的 Fortran 代码来编译并开始为我的研究小组工作。使用 ifort 编译代码时出现以下错误:错误 #6526:从相应的内部共享-do-构造的范围之外发生了到 do-term-shared-stmt 的分支。

这是一段似乎有问题的代码:

...
      IF(THRU.GT.0.D0) GO TO 120                                        00011900
      L1=LL                                                             00012000
      A1=AA                                                             00012100
      DR1=DRR                                                           00012200
      RMAX1=RMAXX                                                       00012300
      RMIN1=RMINN                                                       00012400
      IF(DR1.EQ.0.D0) DR1=DRP                                           00012500
      KMAX1=(RMAX1-RMIN1)/DR1+1.D-08                                    00012600
      IF(KMAX1.GT.NN .OR. KMAX1.LE.0) KMAX1=NN                          00012700
      RINT1=RMAX1                                                       00012800
      IF(RMAX1.NE.0.D0)                                                 00012900
     2RMAX1=DR1*DFLOAT(KMAX1)+RMIN1                                     00013000
      IUP=KMAX1                                                         00013100
      R=RMIN1                                                           00013200
      DO 120 K1=1,KMAX1                                                  00013300
      R=R+DR1                                                           00013400
      XX(K1)=R                                                           00013500
120   CONTINUE                                                          00013600
      WRITE(IW,940) NAM1,IOPT1,L1,A1,DR1,RMAX1,RMIN1,ANU1,BNU1,CNU1     00013700
121   CONTINUE                                                          00013800
...

由于对 fortran 相当不熟悉,我一直在进行一些搜索,我发现它不喜欢 IF 语句分支到 DO 循环的终止语句。另外,似乎一些较旧的方言或编译器支持这一点。

我的问题是:是否有一个选项可以让 ifort 成功编译它? ifort 上是否有特定的方言兼容性选项可以使其合法?

该特定代码对接受它的编译器有何副作用?除了 write 语句之外,副作用是否可能与转到第 121 行相同?或者也许 do 循环应该转到 121?

如果不是因为我的顾问告诉我,在没有先咨询他的情况下我不应该进行任何更改,我会考虑修改代码,所以我问这个问题是为了看看我是否需要咨询他。也就是说,如果我唯一的选择是修改代码,那么我会欢迎建议,以便我在去找顾问时可以了解需要做什么。

最佳答案

我会注意到,即使在 Fortran 77 中,所讨论的代码也是无效的,但人们在过去的迷雾中做了一些奇怪的事情。我会尊重任何历史学家或有经验的人。特别是,应该非常小心地理解代码中与我的“答案”相关的任何微妙之处。

如果我们假设给出的 goto 的目的是在执行循环之后跳转到代码,那么我会回答对代码的最小更改。

为了清楚起见,删除行号注释

      DO 120 K1=1,KMAX1
      R=R+DR1
      XX(K1)=R
 120  CONTINUE
      WRITE(IW,940) NAM1,IOPT1,L1,A1,DR1,RMAX1,RMIN1,ANU1,BNU1,CNU1

可以替换为

      DO K1=1,KMAX1
      R=R+DR1
      XX(K1)=R
      END DO
 120  WRITE(IW,940) NAM1,IOPT1,L1,A1,DR1,RMAX1,RMIN1,ANU1,BNU1,CNU1

如果代码作者希望循环继续到121,我会感到非常惊讶:循环中没有更新write语句引用的变量。 goto 可能旨在引用 121,但我确实看到许多变量在将被跳过的部分中没有更新。

关于fortran - 适用于非常旧的代码的 ifort 方言选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25953788/

相关文章:

c - 编译时未解析的外部符号 "for_realloc_lhs"

c++ - Goto 语句中的堆栈跟踪

fortran - 编译具有多个部分的 Fortran 程序

macos - gfortran : fatal error: no input files compilation terminated

function - 如何在 Fortran 中给函数名起别名

fortran - 以种类参数作为子例程参数的参数化派生类型

python - Python 中不带 goto 的紧急退出

c - 转到和代码重复 - 在这种情况下它们可以避免吗?

memory-management - forrtl : severe (179): Cannot allocate array - overflow on array size calculation

fortran - 互操作性 : Fortran to C++