2016-04-19 5 views
0

Есть ли способ, который может позволить мне отменить эффект «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 
+0

Удалить «THRU E-PROCEDURE1». Я не знаю, какой кошмар программы вы пытаетесь создать. Кажется, вы не знаете о последствиях 'SECTION' и' THRU' для 'PERFORM'. Это программирование с пропуском создает большую кучу PERFORM-спагетти, которая, даже если кажется, что делает то, что вы считаете нужным, будет чрезвычайно трудно понять и сохранить. Опять же, вернитесь к исходной точке и покажите какой-нибудь реальный код, который вы пытаетесь «преобразовать». –

+0

Я добавил то, что вы мне задали Мистер Билл –

+0

Это не настоящая примерная программа. Следующим утверждением является 'GOTO'. Программа будет работать одинаково без GOTO, как @BruceMartin имеет в своем ответе. Где-то у вас есть настоящий код PL/I, который показывает «LEAVE» и все, что вы хотите преобразовать в COBOL. –

ответ

2

A s сказал, не используйте через. Также используйте либо процедуры, либо разделы; не оба. ON ENDFILE (FILE001) устанавливает обработчик исключений для конечного файла

Это примерно то, что ваша программа должна быть:

  03        pic x value 'N'. 
       88 File001-EOF   value 'Y'. 
       88 File001-has-data value 'N'. 

     PERFORM PROCEDURE1 
     display "PERFORM  PROCEDURE2 THRU E--PROCEDURE2" 
     PERFORM PROCEDURE2 
     GOBACK. 

     PROCEDURE1 SECTION. 
      display "BEGIN============PROC PROCEDURE1" 
      display "I AM LABEL LECTURE" 
      Read File001 
      at end set File001-EOF    to true 
      end-read 
      if File001-has-data 
       compute CTR1 = CTR1 + 1; 
      end-if 

      DISPLAY "I AM LABEL ENDD" 
      display " ENDD============PROC PROCEDURE1" 

      EXIT. 
     E--PROCEDURE1. 
      EXIT. 


     PROCEDURE2 SECTION. 
      display "BEGIN============PROC PROCEDURE2" 
      DISPLAY "I AM LABEL PROCEDURE2" 
      display " ENDD============PROC PROCEDURE2" 
      CONTINUE. 
     E--PROCEDURE2. 
      EXIT. 

Для людей более знакомы с Java/C#

ON ENDFILE(FILE001) GOTO ENDD; 

настраивает исключение или обработчик ошибок для условия конечного файла. В java это будет выглядеть так:

try { 
    .... 
} catch (endOfFile e) { 
    Goto ENDD; 
} 
+1

Оптимизирован 'GO TO'. Невозможно помочь :-) –

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

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