Статус документа
Статус документа

ГОСТ 22558-89 (СТ СЭВ 6184-88, ИСО 1989-85) Язык программирования Кобол. Части 8-17

     5.2. Оператор CALL (ВЫЗВАТЬ)

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 (ВЫЗВАТЬ).