退出已调用段落中的段落

时间:2016-04-14 23:13:51

标签: cobol

我正在尝试退出已调用段落中的段落 这是我的代码:

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.

2 个答案:

答案 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