Есть ли способ, который может позволить мне отменить эффект «GO TO» в Cobol Пример:GoBack и GO TO пункте
PERFORM PROCEDURE1 THRU E--PROCEDURE1
display "PERFORM PROCEDURE2 THRU E--PROCEDURE2"
PERFORM PROCEDURE2 THRU E--PROCEDURE2
GOBACK.
PROCEDURE1 SECTION.
display "BEGIN============PROC PROCEDURE1"
PERFORM LECTURE THRU E--LECTURE
PERFORM ENDD THRU E--ENDD
display " ENDD============PROC PROCEDURE1"
CONTINUE.
EXIT.
E--PROCEDURE1.
EXIT.
LECTURE.
display "I AM LABEL LECTURE"
GO TO ENDD
CONTINUE.
E--LECTURE.
EXIT.
ENDD.
DISPLAY "I AM LABEL ENDD"
CONTINUE.
E--ENDD.
EXIT.
PROCEDURE2 SECTION.
display "BEGIN============PROC PROCEDURE2"
DISPLAY "I AM LABEL PROCEDURE2"
display " ENDD============PROC PROCEDURE2"
CONTINUE.
E--PROCEDURE2.
EXIT.
Когда этот код выполняется, я не буду видеть дисплей «ПРОЦЕДУРА ВЫПОЛНЕНИЯ2 THRU E - ПРОЦЕДУРА2», beacause, когда я сделал GO К абзацу ENDD, элемент управления переносится в этот пункт, и я думаю, что я не могу использовать goback до конца proc1? Я ошибаюсь ?
@Bill
Это программа, я пытаюсь перевести:
GOTO5POW : PROC OPTIONS(MAIN);
DCL FILE001 FILE INPUT RECORD ENV(RECSIZE(15));
DCL CTR1 PIC'99' INIT('0');
DCL CARTE CHAR(15);
CALL PROCEDURE1;
PUT SKIP LIST("PERFORM PROCEDURE2 THRU E--PROCEDURE2");
CALL PROCEDURE2;
PROCEDURE1: PROC;
PUT SKIP LIST("BEGIN============PROC PROCEDURE1");
ON ENDFILE(FILE001) GOTO ENDD;
LECTURE:
PUT SKIP LIST("I AM LABEL LECTURE");
READ FILE(FILE001) INTO(CARTE);
CTR1 = CTR1 + 1;
PUT SKIP LIST("Record "||CTR1||"=/" || CARTE ||"/");
IF CARTE="AAAAAAAAAAAAAAA" THEN GOTO ENDD;
ENDD:
PUT SKIP LIST("I AM LABEL ENDD");
PUT SKIP LIST(" ENDD============PROC PROCEDURE1");
END PROCEDURE1;
PROCEDURE2 : PROC;
PUT SKIP LIST("BEGIN============PROC PROCEDURE2");
PUT SKIP LIST("I AM LABEL PROCEDURE2");
PUT SKIP LIST(" ENDD============PROC PROCEDURE2");
END PROCEDURE2;
END GOTO5POW ;
Выход:
BEGIN============PROC PROCEDURE1
I AM LABEL LECTURE
Record 01=/AAAAAAAAAAAAAAA/
I AM LABEL ENDD
ENDD============PROC PROCEDURE1
PERFORM PROCEDURE2 THRU E--PROCEDURE2
BEGIN============PROC PROCEDURE2
I AM LABEL PROCEDURE2
ENDD============PROC PROCEDURE2
Но с COBOL, это генерируемый вывод:
BEGIN============PROC PROCEDURE1
I AM LABEL LECTURE
Record 01=/AAAAAAAAAAAAAAA/
I AM LABEL ENDD
BEGIN============PROC PROCEDURE2
I AM LABEL PROCEDURE2
ENDD============PROC PROCEDURE2
Удалить «THRU E-PROCEDURE1». Я не знаю, какой кошмар программы вы пытаетесь создать. Кажется, вы не знаете о последствиях 'SECTION' и' THRU' для 'PERFORM'. Это программирование с пропуском создает большую кучу PERFORM-спагетти, которая, даже если кажется, что делает то, что вы считаете нужным, будет чрезвычайно трудно понять и сохранить. Опять же, вернитесь к исходной точке и покажите какой-нибудь реальный код, который вы пытаетесь «преобразовать». –
Я добавил то, что вы мне задали Мистер Билл –
Это не настоящая примерная программа. Следующим утверждением является 'GOTO'. Программа будет работать одинаково без GOTO, как @BruceMartin имеет в своем ответе. Где-то у вас есть настоящий код PL/I, который показывает «LEAVE» и все, что вы хотите преобразовать в COBOL. –