Какая польза от «НЕ НА ПЕРЕКЛЮЧЕНИИ» в КОБОЛЕ? - PullRequest
0 голосов
/ 25 сентября 2018

Насколько я понимаю, при использовании UNSTRING использование ON OVERFLOW [INSTRUCTION] будет полезно, если при использовании UNSTRING произойдет переполнение.

Но если переполнения нет, зачем использовать 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: ссылка

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Насколько я понимаю при использовании UNSTRING, использование фразы ON OVERFLOW будет полезно, если при использовании UNSTRING произойдет переполнение.

Но если переполнения нет, почемуВы используете фразу NOT ON OVERFLOW?

Единственной возможной утилитой для фразы NOT ON OVERFLOW будет передача инструкции, если переполнения нет, но какая польза от этого, если вы уже получили ожидаемый результат отUNSTRING?

В языке COBOL 74 не было фразы NOT ON OVERFLOW.Следовательно, необходимо было использовать либо оператор GO TO, либо установить флаг для проверки сразу после оператора IF.Фраза NOT ON OVERFLOW и END-UNSTRING были добавлены в COBOL 85 для улучшения структуры программы.

Для вашего примера я внес некоторые изменения в первое отображение 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

--
0 голосов
/ 26 сентября 2018

Вы можете использовать оператор NOT ON OVERFLOW, если вам нужно вызвать PROCEDURE для проверки этого предложения, например, SORT-COLORS.

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.
...