我正在尝试退出已调用段落中的段落 这是我的代码:
PROCEDURE DIVISION.
display "PGM LEAV9POW: DEBUT"
display "PGM LEAV9POW: DEBUT PROCEDURE NOM_PROC1"
PERFORM NOM_PROC1 THRU E--NOM_PROC1
display "PGM LEAV9POW: FIN PROCEDURE NOM_PROC1"
display "PGM LEAV9POW: FIN"
GOBACK.
NOM_PROC1.
PERFORM LABEL1 THRU E--LABEL1
CONTINUE.
E--NOM_PROC1.
EXIT.
LABEL1 SECTION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
display "PGM LEAV9POW: I AM LABEL1 CALL N°" I
PERFORM LABEL2 THRU E--LABEL2
PERFORM LABEL3 THRU E--LABEL3
END-PERFORM
CONTINUE.
E--LABEL1.
EXIT.
LABEL2.
display "PGM LEAV9POW: I AM LABEL2"
display "PGM LEAV9POW: I WILL LEAVE LABEL1"
EXIT SECTION
CONTINUE.
E--LABEL2.
EXIT.
LABEL3.
display "PGM LEAV9POW: I AM LABEL3"
CONTINUE.
E--LABEL3.
EXIT.
我的结果是:
PGM LEAV9POW: DEBUT
PGM LEAV9POW: DEBUT PROCEDURE NOM_PROC1
PGM LEAV9POW: I AM LABEL1 CALL N°01
PGM LEAV9POW: I AM LABEL2
PGM LEAV9POW: I WILL LEAVE LABEL1
我想我应该:
PGM LEAV9POW: DEBUT
PGM LEAV9POW: DEBUT PROCEDURE NOM_PROC1
PGM LEAV9POW: I AM LABEL1 CALL N°01
PGM LEAV9POW: I AM LABEL2
PGM LEAV9POW: I WILL LEAVE LABEL1
PGM LEAV9POW: FIN PROCEDURE NOM_PROC1
PGM LEAV9POW: FIN
提前感谢您的帮助和建议。
这是对我有用的代码:
PROC1.
PERFORM LABEL1 THRU E--LABEL1
PERFORM LABEL4 THRU E--LABEL4
CONTINUE.
E--PROC1.
EXIT.
LABEL1 SECTION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
display "PGM LEAV9POW: I AM LABEL1 CALL N " I
PERFORM LABEL2 THRU E--LABEL2
PERFORM LABEL3 THRU E--LABEL3
END-PERFORM
CONTINUE.
E--LABEL1 SECTION.
EXIT SECTION.
LABEL2.
display "PGM LEAV9POW: I AM LABEL2"
display "PGM LEAV9POW: I WILL LEAVE LABEL1"
IF J = 1 THEN
EXIT SECTION
END-IF
CONTINUE.
E--LABEL2.
EXIT.
LABEL3.
display "PGM LEAV9POW: I AM LABEL3"
CONTINUE.
E--LABEL3.
EXIT.
LABEL4.
display "PGM LEAV9POW: I AM LABEL4"
CONTINUE.
E--LABEL4.
EXIT.
答案 0 :(得分:1)
最简单的修复,来自顶级原始列表。执行LABEL1 SECTION时删除THRU
NOM_PROC1.
PERFORM LABEL1 THRU E--LABEL1
到
NOM_PROC1.
PERFORM LABEL1
使用-cb_conf = perform-osvs:yes
编译代码我们将研究一些更深层次的问题,但代码正在碰到一个旧的System / 370兼容性问题(默认),关于在跳到最后一段时没有检测到的部分结束,相比之下 - 称为OSVS模式,其中跳转部分对最后一段进行了特殊测试。 (这在某种程度上过于简单化了)。
THRU with SECTION是我们需要研究的问题。 GnuCOBOL中的警告或代码流校正,以使其按预期工作。
prompt$ cobc -xjd secex2.cob -cb_conf=perform-osvs:yes
PGM LEAV9POW: DEBUT
PGM LEAV9POW: DEBUT PROCEDURE NOM_PROC1
PGM LEAV9POW: I AM LABEL1 CALL N°01
PGM LEAV9POW: I AM LABEL2
PGM LEAV9POW: I WILL LEAVE LABEL1
PGM LEAV9POW: FIN PROCEDURE NOM_PROC1
PGM LEAV9POW: FIN
THRU E - LABEL1短语中的内容已从原始列表和GnuCOBOL 2.0中注释掉。一旦删除了部分THRU,GnuCOBOL 1.1应该以与perfrom-osvs: yes
的.conf设置相同的方式工作。
答案 1 :(得分:0)
不可否认,30多年来我还没有写过任何COBOL ......
EXIT SECTION
正是这样听起来的确如此;它完全退出整个部分。在您的情况下,这将返回NOM_PROC1
,然后返回主程序。你可以尝试:
EXIT PARAGRAPH