Вложенные циклы выполнения в COBOL?

Почему я не могу выполнить этот вложенный цикл выполнения в COBOL?

Если я поставлю END-PERFORM. в любой строке раньше, чем там, где у меня последняя только перед ВЫХОДОМ ПРОГРАММЫ - работает. Но мне нужно, чтобы программа отображала значение INPUT C каждый раз. во внешнем цикле выполнения. Это сводит меня с ума.

PROCEDURE DIVISION USING INPUTC CIPHER.
COMPUTE CIPHERMAX = CIPHER.
MULTIPLY -1 BY CIPHER
---> PERFORM VARYING CIPHER FROM 0 BY 1
UNTIL CIPHERMAX = CIPHER
    DISPLAY 'This is loop number: ' CIPHER
    INSPECT INPUTC CONVERTING
    "avcdefghijklmnopqrstuvwxyz" to "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    COMPUTE CONVERTNUM = FUNCTION MOD (CIPHER, 26)
    INSPECT FUNCTION REVERSE(INPUTC) TALLYING LENGTHNUM FOR LEADING SPACES
    COMPUTE LENGTHNUM = LENGTH OF CIPHER - LENGTHNUM

 ---> PERFORM UNTIL SENTRY = LENGTHNUM

            IF ((FUNCTION ORD(INPUTC(SENTRY:1)) + CONVERTNUM) > (FUNCTION ORD('Z')))
             MOVE FUNCTION CHAR((FUNCTION ORD(INPUTC(SENTRY:1)) + CONVERTNUM) - 26) TO RECHAR
              ELSE
             MOVE FUNCTION CHAR(FUNCTION ORD(INPUTC(SENTRY:1)) + CONVERTNUM) TO RECHAR
             END-IF  
              IF (((FUNCTION ORD(INPUTC(SENTRY:1))) >= (FUNCTION ORD('A'))) AND 
             ((FUNCTION ORD(INPUTC(SENTRY:1))) <= (FUNCTION ORD('Z'))))
             IF ((FUNCTION ORD(INPUTC(SENTRY:1)) + CONVERTNUM) > (FUNCTION ORD('Z')))
                INSPECT INPUTC(SENTRY:1) REPLACING ALL INPUTC(SENTRY:1) BY RECHAR
             ELSE
                INSPECT INPUTC(SENTRY:1) REPLACING ALL INPUTC(SENTRY:1) BY RECHAR
             END-IF
          ELSE
                INSPECT INPUTC(SENTRY:1) REPLACING ALL INPUTC(SENTRY:1) BY INPUTC(SENTRY:1)
          END-IF

          COMPUTE SENTRY = SENTRY + 1
        --->  END-PERFORM
    DISPLAY INPUTC.
    COMPUTE LOOPI = LOOPI + 1
    --->END-PERFORM.
EXIT PROGRAM.
END PROGRAM SOLVE.

person user99999991    schedule 25.04.2013    source источник
comment
У вас есть IF с его ELSE, имеющим идентичный код. У вас также есть ELSE с INSPECT, заменяющим символ сам по себе. Почему вы используете INSPECT... REPLACING для однобайтовых полей? Почему бы просто не ДВИГАТЬСЯ? Для чего нужен LOOPI? Почему бы не ДОБАВИТЬ 1 К SENTRY вместо ВЫЧИСЛЕНИЯ? ВЫ УМНОЖАЕТЕ -1, ВЫЧИТАЕТЕ... ИЗ НУЛЯ будет быстрее. Но затем вы сразу же устанавливаете CIPHER в 0 в PERFORM, так зачем все равно отрицать? Я подозреваю, что есть еще что-то, но вы сделали все это трудным для отслеживания с ФУНКЦИЕЙ за ФУНКЦИЕЙ.   -  person Bill Woodger    schedule 26.04.2013
comment
Кроме того, в avcdefghijklmnopqrstuvwxyz вы могли иметь в виду abc...   -  person Dan Lugg    schedule 17.07.2013


Ответы (2)


Эта неприятная область, заканчивающаяся периодом после DISPLAY INPUTC., завершает область действия вложенных операторов PERFORM. Избавьтесь от периода, и все должно работать нормально.

Единственные точки, которые вы должны когда-либо использовать в разделе процедур при кодировании программы в соответствии со стандартом COBOL-85, - это те, которые необходимы для завершения заголовков разделов и абзацев, а еще одна - для завершения текущего абзаца, раздела или программы.

person NealB    schedule 25.04.2013

У вас есть точка в операторе display INPUTC. Удалите период, и все будет в порядке. Период всегда завершает выражение.

person Baruch Atta    schedule 12.07.2013