Получение идеи для использования оператора вызова

Мне нужно спросить, в чем проблема в этой моей программе меню, когда я вызываю другую программу

нажав 1 или 2, и когда программа вызвала, я не мог вернуться в свою программу меню,

не могли бы вы помочь мне, пожалуйста, как я могу вернуться в свое меню, когда я нажимаю клавишу Esc, или

мой оператор вызова неверен.

это код моей программы меню.

LINKAGE SECTION.
   01 MY-PROG1 PIC X.
   01 MY-PROG2 PIC X.

......
......
......

MAIN.

       DISPLAY MENU-HEADER ERROR-MESSAGE.
       PERFORM ENTRY-MENU UNTIL CHOICE = 3.     
       STOP RUN.

   ENTRY-MENU.
       ACCEPT MENU-SELECT.
       PERFORM INPUT-CHOICE UNTIL CHOICE = 3.
       STOP RUN.

   INPUT-CHOICE.
       IF CHOICE = 1
         CALL  'MY-PROGRAM1' USING MY-PROG1 
       ELSE IF CHOICE =2
         CALL 'MY-PROGRAM2' USING MY-PROG2
       ELSE 
          MOVE "INVALID INPUT....." TO ERRMSG
          DISPLAY ERROR-MESSAGE.

это MY-PROGRAM1.COB так я вызываю программу меню, когда нажимаю клавишу Esc

LINKAGE SECTION.
   01   MY-PROG1 PIC X.
   01   MY-MENU  PIC X.

......
......
......


MAIN.

 .......
 .......
 STOP RUN.

ENTER-BIRTHDATE.

  ACCEPT...
  .......

  IF ESC-KEY
     DISPLAY CLEAR-SCREEN
     CALL 'MENU'

  ELSE IF F10
    .....
    .....       

person jemz    schedule 05.05.2012    source источник


Ответы (1)


Вы должны заменить оператор STOP RUN в вызываемой программе на GOBACK.

Это общие правила использования STOP RUN и GOBACK:

Оператор GOBACK отмечает логический конец вызываемой программы.

Общие правила Если оператор GOBACK выполняется в программе, находящейся под управлением вызывающего элемента среды выполнения, объектная программа действует так, как будто выполняется оператор EXIT PROGRAM, содержащий те же предложения, что и оператор GOBACK. См. тему Заявление EXIT. Если оператор GOBACK без предложения ADDRESS OF выполняется в программе, которая не находится под управлением вызывающего элемента среды выполнения, объектная программа действует так, как будто выполняется оператор STOP RUN, содержащий те же предложения, что и оператор GOBACK. Если оператор GOBACK с предложением ADDRESS OF выполняется в программе, которая не находится под управлением вызывающего элемента среды выполнения, объектная программа работает так же, как если бы выполнялась инструкция STOP RUN, за исключением того, что в системной области устанавливается произвольное возвращаемое значение. Оператор GOBACK может привести к более компактному коду, чем эквивалентные операторы EXIT PROGRAM и STOP RUN. Оператор GOBACK не должен выполняться при выполнении декларативной процедуры, в которой указана фраза GLOBAL, кроме как в программе, вызываемой при выполнении этой декларативной процедуры. Если оператор GOBACK выполняется в функции, функция работает так, как если бы выполнялась инструкция EXIT FUNCTION. Если инструкция GOBACK выполняется в методе, метод работает так, как если бы выполнялась инструкция EXIT METHOD. Если оператор GOBACK выполняется в итераторе, итератор работает так, как если бы выполнялся оператор EXIT ITERATOR.

ОСТАНОВИТЬ БЕГ. Это зависит от вашей системы. STOP RUN на большинстве компиляторов завершает программу, и если она вызывается другой программой cobol, то весь процесс завершается.

В конце этого ссылка вы можете найти хорошую схему, которая представляет все эти отношения.

Изменить: (из старой документации Microsoft Cobol)

EXIT PROGRAM STATEMENT: Оператор EXIT PROGRAM, появляющийся в вызываемой подпрограмме, возвращает управление следующему исполняемому оператору после CALL в вызывающей программе. Это утверждение должно быть отдельным абзацем.

person alain.janinm    schedule 05.05.2012
comment
привет alain.janinm, спасибо за быстрый ответ и за обсуждение, которое помогает мне просветить мой разум. большое спасибо - person jemz; 05.05.2012
comment
Кстати, действует ли ЗАЯВЛЕНИЕ О ВЕРНУНИИ для MS COBOl 2.20? - person jemz; 05.05.2012
comment
На самом деле я никогда не использовал MS Cobol, я работал с Microfocus Cobol. Я пытался найти какую-то документацию, но безуспешно, кажется, она довольно старая... Так что, я думаю, вы можете использовать GOBACK, попробуйте и дайте мне знать! - person alain.janinm; 05.05.2012
comment
да, это правда, что сегодня он никогда не использовался. Я также ищу документацию, но все равно не повезло. Хорошо, я дам вам знать, если это сработает. Еще раз спасибо. - person jemz; 05.05.2012
comment
@jemz Я внес изменения с другим возможным утверждением, которое вы можете использовать. Я нашел документацию Microsoft Cobol, не уверен, что она применима к вашей версии, но это единственный документ Microsoft и Cobol, который я нашел: bitsavers.org/pdf/microsoft/cpm/Microsoft_COBOL-80_1978.pdf - person alain.janinm; 05.05.2012
comment
, я пытался использовать GOBACK, но он не работает. Он говорит, что неузнаваемый элемент игнорируется: GOBACK - person jemz; 05.05.2012
comment
Хорошо, я попытаюсь прочитать этот PDF-файл, может быть, я смогу найти в этом что-то полезное. Еще раз спасибо. - person jemz; 05.05.2012
comment
@jemz да, попробуйте оператор EXIT PROGRAM, я добавил описание в свой ответ. - person alain.janinm; 05.05.2012
comment
Сначала я попробовал оператор EXIT, когда я нажал № 1, он вызывает мою программу 1, а затем я нажал клавишу Esc, и он вернулся в программу меню, и я снова нажал № 1, он снова выполнил программу 1, но я нажал Esc ключ, он генерирует ошибку времени выполнения Недостаточно памяти для программы, Программа: программа1 и т. Д. Как я могу это исправить? - person jemz; 06.05.2012
comment
Вы написали PERFORM INPUT-CHOICE UNTIL CHOICE = 3., но значение выбора никогда не устанавливается равным 3 нет? - person alain.janinm; 06.05.2012
comment
И когда вы нажимаете escape, вы не должны снова и снова вызывать «меню», а выходить из программы, чтобы вернуться в меню, я думаю. - person alain.janinm; 06.05.2012