5.2.1. Назначение
Оператор CALL (ВЫЗВАТЬ) вызывает передачу управления от одной объектной программы к другой внутри единицы исполнения.
5.2.2. Общий формат
Формат 1
Формат 2
5.2.3. Синтаксические правила
(1) Литерал-1 должен быть нечисловым литералом.
(2) Идентификатор-1 должен быть определен как буквенно-цифровое данное такое, что его значение может быть именем-программы. |
(3) Каждый операнд во фразе USING (ИСПОЛЬЗУЯ) должен быть предварительно определен как данное в секции файлов, секции рабочей памяти, секции коммуникаций или секции связи и должен быть данным уровня 01, уровня 77 или элементарным данным.
5.2.4. Общие правила
(1) Литерал-1 является именем вызываемой программы. Программа, в которой появляется оператор CALL (ВЫЗВАТЬ), является вызывающей программой. Если вызываемая программа - это программа Кобола, то литерал-1 должно быть именем программы, содержащимся в параграфе PROGRAM-ID (ПРОГРАММА) вызываемой программы. Если вызываемая программа - не программа Кобола, правила формирования имени программы определяются реализацией.
(3) Если во время выполнения оператора CALL (ВЫЗВАТЬ) устанавливается, что программа, заданная в операторе CALL (ВЫЗВАТЬ), не может стать доступной для выполнения в это время, будет выполнено одно из указанных действий. Ресурсы времени выполнения, которые должны проверяться с целью установления доступности вызываемой программы для выполнения, определяются реализацией.
(4) Две или несколько программ в единице исполнения могут иметь одно и то же имя-программы, и ссылка в операторе CALL (ВЫЗВАТЬ) на такое имя-программы разрешается по правилам для области действия для имен программ (см. п.1.3.8.1 настоящей части). Например, когда только две программы в единице исполнения имеют одинаковое имя, которое указано в операторе CALL (ВЫЗВАТЬ): а) одна из этих двух программ должна прямо или косвенно содержаться в отдельно компилируемой программе, в которой находится этот оператор CALL (ВЫЗВАТЬ), или в отдельно компилируемой программе, которая сама прямо или косвенно содержит программу, в которой находится этот оператор CALL (ВЫЗВАТЬ), и б) вторая из этих двух программ должна быть другой отдельно компилируемой программой. Механизм, используемый в этом примере, состоит в следующем: а) если одна из двух программ, имеющих одинаковое имя, которое указано в операторе CALL (ВЫЗВАТЬ), прямо содержится в программе, в которой находится оператор CALL (ВЫЗВАТЬ), эта программа вызывается; б) если одна из двух программ, имеющих одинаковое имя, которое указано в операторе CALL (ВЫЗВАТЬ), имеет атрибут "общая" и прямо содержится в другой программе, прямо или косвенно содержащей программу, в которой находится оператор CALL (ВЫЗВАТЬ), вызывается эта общая программа, если только вызывающая программа не содержится в этой общей программе; |
в) в остальных случаях вызывается отдельно компилируемая программа. При всех остальных входах в вызываемую программу состояние этой программы и каждой программы, прямо или косвенно содержащейся в ней, остается таким же, каким оно было во время последнего выхода из программы. |
(6) Если вызываемая программа имеет атрибут "начальная", она и каждая программа, прямо или косвенно содержащаяся в ней, устанавливается в свое начальное состояние при каждом вызове вызываемой программы в единице исполнения. |
(7) Файлы, связанные с внутренними определителями файлов вызываемой программы, не находятся в открытом состоянии, когда программа находится в начальном состоянии (см. п.2.4 настоящей части). При всех остальных входах в вызываемую программу состояние и позиционирование всех таких файлов такое, каким оно было при последнем выходе из вызываемой программы. |
(8) Процесс вызова программы или выхода из вызываемой программы не изменяет состояние или позиционирование файла, связанного с внешним определителем файла. |
(9) Если вызываемая программа - это программа Кобола, фраза USING (ИСПОЛЬЗУЯ) включается в оператор CALL (ВЫЗВАТЬ) только тогда, когда в заголовке раздела процедур вызываемой программы имеется фраза USING (ИСПОЛЬЗУЯ); в этом случае количество операндов в каждой фразе USING (ИСПОЛЬЗУЯ) должно быть одинаковым. Если вызываемая программа - это программа не на Коболе, использование фразы USING (ИСПОЛЬЗУЯ) определяется реализацией.
(10) Последовательность появления имен-данных во фразе USING (ИСПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ) и в соответствующей фразе USING (ИСПОЛЬЗУЯ) в заголовке раздела процедур вызываемой программы устанавливает соответствие между именами-данных, используемыми в вызывающей и вызываемой программах. Это соответствие является позиционным, а не определяется эквивалентностью имен; первое имя-данного в одной фразе USING (ИСПОЛЬЗУЯ) соответствует первому имени-данного во второй фразе, второе имя-данного в одной фразе соответствует второму имени данного во второй фразе USING (ИСПОЛЬЗУЯ) и т.д.
(11) Значения параметров, названных во фразе USING (ИСПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ), становятся доступными для вызываемой программы во время выполнения оператора CALL (ВЫЗВАТЬ).