gnu在COBOL中使用"NOT ON OVERFLOW"有什么用?



根据我在使用UNSTRING时的理解,如果在使用UNSTRING时会出现溢出,使用ON OVERFLOW [INSTRUCTION]将很有用。

但是如果没有溢出,为什么要使用NOT ON OVERFLOW [INSTRUCTION]

NOT ON OVERFLOW [INSTRUCTION]唯一可能的效用是如果没有溢出,则传递指令,但是如果您已经从UNSTRING中获得了预期的结果,那将有什么用呢?

是否有任何具体的例子说明这在本例中如何有用:

IDENTIFICATION DIVISION.
PROGRAM-ID. YOUR-PROGRAM-NAME.
DATA DIVISION.
FILE SECTION.

WORKING-STORAGE SECTION.
01 WS-VAR1 PIC A(11) VALUE "Hello World".
01 WS-VAR2 PIC A(5).
01 WS-VAR3 PIC A(5).
01 WS-COMPTEUR PIC 9 VALUE 2.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
INTO WS-VAR2 WS-VAR3
WITH POINTER WS-COMPTEUR
ON OVERFLOW DISPLAY "This string is too large"
END-UNSTRING.
DISPLAY WS-VAR2
DISPLAY WS-VAR3.
STOP RUN.
END PROGRAM YOUR-PROGRAM-NAME.

即使我阅读了 IBM 文档,它也没有给我太多关于在这种情况下可以使用什么的解释,但显示一条消息?

IBM 文档 : 链接

根据我对使用 UNSTRING 时的理解,使用 ON OVERFLOW 短语将很有用,如果在使用中会出现溢出 的取消字符串。

但是如果没有溢出,你为什么要使用 NOT ON OVERFLOW 短语?

唯一可能的实用程序 不 在溢出 短语是 如果没有溢出,则传递指令,但会是什么 如果您已经从 解串 ?

在 COBOL 74 中没有NOT ON OVERFLOW短语。因此,有必要使用GO TO语句或在紧随其后的IF语句中设置测试标志。COBOL 85 中添加了NOT ON OVERFLOW短语和END-UNSTRING,以改进程序结构。

对于您的示例,我进行了一些更改,首先显示WS-VAR1然后显示UNSTRING的结果。请注意,OVERFLOW条件涉及项目数,而不是文本的长度。我运行了三个测试来显示结果

IDENTIFICATION DIVISION.
PROGRAM-ID. YOUR-PROGRAM-NAME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAR1 PIC A(11) VALUE "Hello World".
01 WS-VAR2 PIC A(5).
01 WS-VAR3 PIC A(5).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
MOVE SPACE TO WS-VAR2 WS-VAR3
DISPLAY WS-VAR1
UNSTRING WS-VAR1
DELIMITED SPACE
INTO WS-VAR2 WS-VAR3
ON OVERFLOW
DISPLAY
"Incorrect number of items in WS-VAR1 - expected 2"
NOT ON OVERFLOW
DISPLAY WS-VAR2
DISPLAY WS-VAR3
END-UNSTRING
STOP RUN.
END PROGRAM YOUR-PROGRAM-NAME.

结果:

Hello World
Hello
World
--
Hello
Incorrect number of items in WS-VAR1 - expected 2
--
Hello W rld
Incorrect number of items in WS-VAR1 - expected 2

从代码中可以看出,ON OVERFLOW用于错误处理;NOT ON OVERFLOW用于正常处理。如果没有NOT ON OVERFLOW改进的结构,正常的处理将立即跟随错误处理,除非使用前面提到的COBOL 74类型的处理。

请注意,DELIMITED ALL SPACE给出的结果与上述一种情况显示的结果不同。[忽略--]

--
Hello
Hello
--

如果需要调用 PROCEDURE 来验证此句子(例如 SORT-COLORS(,则可以使用 "NOT ON OVERFLOW " 语句。

MOVE 0 TO COUNT-1.   
UNSTRING COLOR-LIST   
DELIMITED BY ":" OR "/" OR ALL SPACE   
*DELIMIT-1 and COUNT-1 will hold only   
*the values associated with COLOR-1.   
INTO COLOR-1   
DELIMITER IN DELIMIT-1   
COUNT IN COUNT-1,   
COLOR-2,   
COLOR-3,   
COLOR-4   
ON OVERFLOW    
DISPLAY "overflow: unstring colors"   
NOT ON OVERFLOW   
*do when UNSTRING succeeds.   
PERFORM **SORT-COLORS**   
END-UNSTRING.   
*COLOR-1 = "RED   "   
*COLOR-2 = "BLUE  "   
*COLOR-3 = "GREEN "   
*COLOR-4 = "YELLOW"   
*DELIMIT-1 = ":  "   
*COUNT-1 = 3 count-1 holds the number of characters in RED   

您可以在此链接上查看更多示例 https://supportline.microfocus.com/documentation/acucorpproducts/docs/v6_online_doc/gtman3/gt36141.htm

在实践中,如果您需要发现您的命令(unsting(是否成功执行,并且没有IF,您可以使用此语句来定义它。

使用应用程序的示例

IDENTIFICATION DIVISION.
PROGRAM-ID. YOUR-PROGRAM-NAME.
DATA DIVISION.
FILE SECTION.

WORKING-STORAGE SECTION.
01 WS-VAR1 PIC A(11) VALUE "Hello World".
01 WS-VAR2 PIC A(5).
01 WS-VAR3 PIC A(5).
01 WS-COMPTEUR PIC 9 VALUE 2.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
INTO WS-VAR2 WS-VAR3
WITH POINTER WS-COMPTEUR
ON OVERFLOW 
PERFORM RT-SEND-ERROR-MAIL
NOT ON OVERFLOW 
PERFORM RT-SEND-SUCESS-MAIL
END-UNSTRING.
DISPLAY WS-VAR2
DISPLAY WS-VAR3.
STOP RUN.
END PROGRAM YOUR-PROGRAM-NAME.

最新更新