我突然被给了一些非常旧的fortran代码来编译并为我的研究小组工作。在编译代码时使用ifort我收到以下错误:error #6526: A branch to a do-term-shared-stmt has occurred from outside the range of the corresponding inner-shared-do-construct.
以下是似乎有问题的代码:
...
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成功编译? I.E.在ifort上是否有特定的方言兼容性选项,这将使其合法化?
特定代码对接受它的编译器有什么副作用?除了写声明之外,副作用是否可能与第121行相同?或者也许是循环应该去121?
我会考虑修改代码,如果不是因为我的顾问告诉我,如果不先咨询他就不应该做任何改动,所以我问这个问题,看看我是否需要咨询他。这就是说,如果我唯一的选择是对代码进行修改,那么建议会受到欢迎,以便我可以了解当我去咨询顾问时需要做些什么。
答案 0 :(得分:1)
我会注意到有问题的代码即使作为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
,但我确实看到许多变量未在要跳过的部分中更新。