Как динамический вызов Cobol работает с использованием группы в качестве идентификатора программы?

У меня есть следующий оператор вызова:

038060     CALL        PROG USING
038070                 DFH
038080                 L000
038090                 ZONE-E
038100                 ZONE-S.

Этот вызов является динамическим и использовать PROG.

PROG - это группа, определяемая как:

018630 01                 XX00.
018640        10          PROG.
018650         15         XX00-S06  PICTURE X(6)
018660                         VALUE  SPACE.
018670         15         XX00-S02  PICTURE X(2)
018680                         VALUE  SPACE.
018690        10          XX00-S92  PICTURE 9(02)
018700                         VALUE  ZERO.
018710        10          XX00-S91  PICTURE 9(1)
018720                         VALUE  ZERO.
018730        10          XX00-S9Z PICTURE 9(1)
018740                         VALUE  ZERO.
018750        10          XX00-9B0 PICTURE X(05)
018760                         VALUE  SPACE.
018770        10          XX00-0B0 PICTURE X(02)
018780                         VALUE  SPACE.
018790        10          XX00-BB1 PICTURE X(01)
018800                         VALUE  SPACE.
018810        10          XX00-SFN PICTURE X(07)
I cut here but there is a lot of field after...

Кажется, что фактическая программа для использования хранится в:

XX00-S06

а также

XX00-S02

У меня также есть другие случаи, когда имя находится в 3 или 4 полях, а длина progname не всегда равна 8.

Поэтому мой вопрос в том, как Cobol узнает, где выбрать правильное название программы в группе? Каковы правила разрешения?

Конфигурация: я использую компилятор Microfocus Net Express, а среда - UniKix.

2 ответа

Решение

Правила динамического вызова в COBOL довольно просты. Учитывая что-то вроде:

    CALL WS-NAME USING...

COBOL разрешит имя программы, которая в данный момент хранится в WS-NAME против доступных ему модулей загрузки библиотеки на основе линейного поиска. Первое совпадающее имя точки входа загрузочного модуля, соответствующее WS-NAME используется.

Неважно, насколько сложное или простое определение WS-NAME является. Общая длина, используемая для имени, равна длине WS-NAME является. Например:

   01 WS-NAME.
      05 WS-NAME-FIRST-PART     PIC X(3).
      05 WS-NAME-MIDDLE-PART    PIC X(2).
      05 WS-NAME-LAST-PART      PIC X(3).

WS-NAME состоит из 3 подчиненных полей, дающих в общей сложности 8 символов. Вы можете заполнить их индивидуально или просто перенести что-то в WS-NAME в целом. Если длина WS-NAME меньше 8 символов, конечные символы будут установлены в качестве пробела в любом принимающем поле. Например:

  01 WS-SHORT-NAME.
     05 WS-SHORT-NAME-FIRST-PART          PIC X(4) VALUE 'AAAA'.
     05 WS-SHORT-NAME-LAST-PART           PIC X(2) VALUE 'BB'.

Вот WS-SHORT-NAME длиной всего 6 символов. MOVING WS-SHORT-NAME больше PIC X переменная типа как в:

  MOVE WS-SHORT-NAME TO WS-NAME

В результате WS-NAME получит значение AAAABBbb(обратите внимание на два пробела). Во время поиска в либрии подходящего имени точки входа конечные пробелы не имеют значения, поэтому в операторе CALL вы можете использовать либо:

  CALL WS-NAME

или же

  CALL-WS-SHORT-NAME

И они разрешат к той же точке входа.

Я не уверен, каковы правила длины для MicroFocus COBOL, но для IBM z/os имена динамически вызываемых программ не могут превышать 8 символов (если они есть, имя усекается до 8 символов).

Я добавлю немного больше в NeilB с конкретной информацией о Micro Focus COBOL.

fyi: PROGRAM-ID, ENTRY-POINTS ограничены 30-31 символами (см. раздел "Системные ограничения и программные ограничения" в документации).

Другие вопросы по тегам