2016-04-10 5 views
0

Я пытаюсь вызвать внутреннюю запись в коболе. Звонок в порядке, но проблема в том, что после записи есть несколько абзацев, которые также ошибочно выполняются.Остановить эффект вызова записи

Вот моя программа:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. ENTR1POW. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    LOCAL-STORAGE SECTION. 
    PROCEDURE DIVISION. 
    display "BEFORE CALL NOM_PROC1=======================" 
    PERFORM NOM_PROC1 THRU E--NOM_PROC1 
    display "AFTER CALL NOM_PROC1=======================" 
    display "CALL NOM_PROC2=============================" 
    PERFORM NOM_PROC2 THRU E--NOM_PROC2 
    display "CALL ENTRY1============================" 
    CALL 'ENTRY1' 
    GOBACK. 

    NOM_PROC1. 
     display "PGM ENTR1POW: BEGIN NOM_PROC1" 
     display "PGM ENTR1POW: END NOM_PROC1" 
     CONTINUE. 
    E--NOM_PROC1. 
     EXIT. 

    NOM_PROC2 SECTION. 
     display "PGM ENTR1POW: BEGIN NOM_PROC2" 

     ENTRY 'ENTRY1' 
     display "===========BEGIN ENTRY ENTRY1" 
     display "===========END ENTRY ENTRY1" 

     ENTRY 'ENTRY2' 
     display "===========BEGIN ENTRY ENTRY2" 
     display "===========END ENTRY ENTRY2" 

     ENTRY 'ENTRY3' 
     display "===========BEGIN ENTRY ENTRY3" 
     display "===========END ENTRY ENTRY3" 

     display "PGM ENTR1POW: END NOM_PROC2" 
     CONTINUE. 
    E--NOM_PROC2. 
     EXIT. 

    NOM_PROC3 SECTION. 
     display "PGM ENTR1POW: BEGIN NOM_PROC3" 
     display "PGM ENTR1POW: END NOM_PROC3" 
     CONTINUE. 
    E--NOM_PROC3 SECTION. 
     EXIT. 

    NOM_PROC4. 
     display "PGM ENTR1POW: BEGIN NOM_PROC4" 
     display "PGM ENTR1POW: END NOM_PROC4" 
     CONTINUE. 
    E--NOM_PROC4. 
     EXIT. 

Выход, что я полученный:

BEFORE CALL NOM_PROC1======================= 
PGM ENTR1POW: BEGIN NOM_PROC1 
PGM ENTR1POW: END NOM_PROC1 
AFTER CALL NOM_PROC1======================= 
CALL NOM_PROC2============================= 
PGM ENTR1POW: BEGIN NOM_PROC2 
===========BEGIN ENTRY ENTRY1 
===========END ENTRY ENTRY1 
===========BEGIN ENTRY ENTRY2 
===========END ENTRY ENTRY2 
===========BEGIN ENTRY ENTRY3 
===========END ENTRY ENTRY3 
PGM ENTR1POW: END NOM_PROC2 
CALL ENTRY1============================ 
===========BEGIN ENTRY ENTRY1 
===========END ENTRY ENTRY1 
===========BEGIN ENTRY ENTRY2 
===========END ENTRY ENTRY2 
===========BEGIN ENTRY ENTRY3 
===========END ENTRY ENTRY3 
PGM ENTR1POW: END NOM_PROC2 
PGM ENTR1POW: BEGIN NOM_PROC3 
PGM ENTR1POW: END NOM_PROC3 
PGM ENTR1POW: BEGIN NOM_PROC4 
PGM ENTR1POW: END NOM_PROC4 

Я думаю, что призыв к пунктам NOM_PROC3 и NOM_PROC4 не должно произойти.

+0

Я сказал, что если бы я переместил абзац NOM_PROC2 в конец программы, тогда моя проблема будет решена, но я хочу это сделать? Есть ли другой способ решить мою проблему. Благодарим вас за сообщение. –

+0

Какой компилятор вы используете? ENTRY не предназначен для программы, которая ВЫЗЫВАЕТ ее, она должна находиться в другой программе. Что ты пытаешься сделать? Как сказал @cschneid, «содержащаяся» или «вложенная» программа, вероятно, больше того, что вы хотите. Вы также смутитесь, если считаете, что PERFORM является CALL. Это не так, поэтому сообщения неверны. –

ответ

2

First, думаю твердый перед тем как использовать ENTRY. За 30 лет кодирования я встречался один раз в программе, написанной в начале 1970-х годов, и там она не служила никакой полезной цели. Рассмотрите вложенные программы, если вы видите необходимость в ENTRY. @BrianTiffin делает случай для ENTRY в средах без мэйнфрейма в комментариях.

Оператор ENTRY устанавливает альтернативную точку входа в вашем коде. Это не похоже на PERFORM. Вы должны явно вернуться из этой альтернативной точки входа так же, как вы вернетесь из своей основной точки входа. Обычно это делается с помощью инструкции GOBACK.

Ваша программа ведет себя так, как должна. У вас нет GOBACK после заявления ENTRY 'ENTRY1', поэтому, когда вы делаете CALL 'ENTRY1', выполнение кода продолжается до тех пор, пока оно не встретит конец программы.

+0

Причина, по которой я использую записи, заключается в том, что я пытаюсь перенести программы PL1, содержащие записи, и я пытаюсь сохранить этот аспект в моих перенесенных программах. –

+0

Наконец, я наружу абзац, содержащий записи в подпрограмму, и он работает для меня. –

+0

Я бы просто хотел добавить вторую. Для программирования GUI 'ENTRY' - это мощная вещь. Он позволяет обратным вызовам иметь доступ к состоянию в рабочем хранилище. Удобно подходит для таких вещей, как GTK + кнопки кликов, а также события X11 и т. Д. –