Как динамический вызов Cobol работает с использованием группы в качестве идентификатора программы? - PullRequest
0 голосов
/ 13 февраля 2012

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

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

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

PROG - определенная группаas:

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.

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

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

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Динамические правила вызова в 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 примет значение AAAABB bb (обратите внимание на два пробела). Во время поиска в библиотеке для совпадающего имени точки входа конечные пробелы не имеют значения, поэтому в операторе CALL вы можете использовать либо:

  CALL WS-NAME

или

  CALL-WS-SHORT-NAME

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

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

1 голос
/ 20 апреля 2012

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

fyi: ID ПРОГРАММЫ, ТОЧКИ ВВОДА ограничены 30-31 символами (см. Раздел «Ограничения системы и ограничения программирования» в документации).

...