2016-04-14 4 views
0

Вопрос, как бы COBOL справился со следующим утверждением?Выполнение оценки До тех пор, пока не будет 0

MOVE ZERO TO WS-SUB-2. 

А потом:

PERFORM A100 
     VARYING WS-SUB FROM 1 BY 1 
     UNTIL WS-SUB > WS-SUB-2. 

Причина в том, что я есть выполнять не изменяя пока где сравниваются 2 переменных, но "WS-SUB-2" может быть равен нулю. Мне просто нужно знать, будет ли когда-либо выполняться «A100».

+1

Нет. Если это последовательные строки кода, например, A100 никогда не будет ВЫПОЛНЕН оттуда. Вы можете * использовать WITH TEST AFTER, что обеспечит вам A100 один раз. Лучше структурировать свой код, чтобы «объяснить» данные, чем скрипка, чтобы уменьшить количество строк кода. –

+0

И если они не являются последовательными строками кода, но WS-SUB-2 равен нулю, когда встречается PERFORM, он не обрабатывается так, как записано, потому что тест выполняется сначала (BEFORE), по умолчанию, а не ПОСЛЕ. –

+0

Я попытался набрать их как отдельные строки, а не всю одну строку, не уверен, почему она вернула их в одну строку, но спасибо. – GuyWithADeathWish

ответ

0

A100 не выполняется.

- это петля с явным счетчиком циклов , что означает, что он знает о последовательности каждой итерации. Что именно происходит, заключается в следующем:

  • WS-SUB устанавливается в 1
  • Выражение WS-SUB > WS-SUB-2 оценивается.
    • Если WS-SUB is greater than WS-SUB-2, то вырваться из цикла и продолжить со следующим утверждением.
    • И еще, выполните процедуру A100; и наконец WS-SUB увеличивается на 1.

Потому что в самом начале WS-SUB больше WS-SUB-2, преформы утверждение немедленно прекращается, таким образом A100 никогда не выполняется.

Немного сложно понять, что именно вы хотите. Вот несколько предложений:

  • Если вы хотите A100 быть выполнен по крайней мере один раз, вы можете использовать это:

    IF WS-SUB-2 = ZERO 
        MOVE 1 TO WS-SUB-2 
    END-IF 
    
  • Если вы хотите выполнить A100WS-SUB-2 + 1 раз, а затем либо изменить UNTIL WS-SUB > WS-SUB-2 TO UNTIL WS-SUB > WS-SUB-2 + 1 или сменить FROM 1 на номер FROM 0.

+0

'IF WS-SUB-2 EQUAL ДЛЯ ZERO PERFORM A100 ELSE dotheloop' –

0

Нет, A100 не будет выполнен. Потому что PERFORM по умолчанию - WITH TEST BEFORE. Поэтому, как только PERFORM обнаруживает, что WS-SUB (1) больше WS-SUB2 (0), он останавливается. Если вы хотите, чтобы A100 выполнял один раз, вы можете использовать PERFORM WITH TEST AFTER. И в этом случае A100 будет работать один раз.

 Смежные вопросы

  • Нет связанных вопросов^_^