Как динамический вызов 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 символами (см. раздел "Системные ограничения и программные ограничения" в документации).