Механизм, используемый в этом примере, состоит в следующем:
если одна из двух программ, имеющих одинаковое имя, которое указано в операторе CALL (ВЫЗВАТЬ), прямо содержится в программе, в которой находится оператор CALL (ВЫЗВАТЬ), эта программа вызывается;
если одна из двух программ, имеющих одинаковое имя, которое указано в операторе CALL (ВЫЗВАТЬ), имеет атрибут «общая» и прямо содержится в другой программе, прямо или
■; косвенно содержащей программу, в которой находится оператор ; CALL (ВЫЗВАТЬ), вызывается эта общая программа, если ' только вызывающая программа не содержится в этой общей программе;
в остальных случаях вызывается отдельно компилируемая •программа.
I Если I вызываемая программа | не имеет атрибута «начальная», тогда она и каждая программа, прямо или косвенно содержащаяся в ней, | находятся в начальном состоянии при пер- вом вызове этой программы в единице исполнения |"^ при ее пер- вом вызове после оператора CANCEL (ОСВОБОДИТЬ) для вызываемой программы.
При всех остальных входах в вызываемую программу состояние этой программы и каждой программы, прямо или косвенно со- держащейся в ней, остается таким же, каким оно было во время последнего выхода из программы.
Если вызываемая программа имеет атрибут «начальная», она и каждая программа, прямо или косвенно содержащаяся в ней, устанавливается в свое начальное состояние при каждом вызове вызываемой программы в единице исполнения.
Файлы, связанные с внутренними определителями файлов вызываемой программы, не находятся в открытом состоянии, когда программа находится в начальном состоянии (см. п. 2.4 настоящей части).
При всех остальных входах в вызываемую программу состояние и позиционирование всех таких файлов такое, каким оно было при последнем выходе из вызываемой программы.
Процесс вызова программы или выхода из вызываемой программы не изменяет состояние или позиционирование файла, связанного с внешним определителем файла.
Если вызываемая программа — это программа Кобола, фраза USING (ИСПОЛЬЗУЯ) включается в оператор CALL (ВЫЗВАТЬ) только тогда, когда в заголовке раздела процедур вызываемой программы имеется фраза USING (ИСПОЛЬЗУЯ); в этом случае количество операндов в каждой фразе USING (ИСПОЛЬЗУЯ) должно быть одинаковым. Если вызываемая программа — это программа не на Коболе, использование фразы USING (ИСПОЛЬЗУЯ) определяется реализацией.
Последовательность появления имен-данных во фразе USING (ИСПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ) и в соот-
S64
ветствующей фразе USING (ИСПОЛЬЗУЯ) в заголовке раздела процедур вызываемой 'программы устанавливает соответствие между именами-данных, используемыми в вызывающей и вызываемой программах. Это соответствие является позиционным, а не определяется эквивалентностью имен; первое имя-данного в одной фразе USING (ИСПОЛЬЗУЯ) соответствует первому имени-дан- ного во второй фразе, второе имя-данного в одной фразе соответствует второму имени данного во второй фразе USING (ИСПОЛЬЗУЯ) и т. д.
Значения параметров, названных во фразе USING (ИСПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ), становятся доступными для вызываемой программы во время выполнения оператора CALL (ВЫЗВАТЬ).
I Обе фразы BY CONTENT (ЗНАЧЕНИЕ) и BY REFE- . RENCE (ССЫЛКУ НА) распространяются на все параметры, следующие за ними, до тех пор, пока не встретится другая фраза BY CONTENT (ЗНАЧЕНИЕ) или BY REFERENCE (ССЫЛКУ НА). Если перед первым параметром не задана ни фраза BY CONTENT (ЗНАЧЕНИЕ), ни BY REFERENCE (ССЫЛКУ НА), подразумевается фраза BY REFERENCE (ССЫЛКУ НА).
Если для параметра | задана или | подразумевается фраза BY REFERENCE (ССЫЛКУ НА), объектная программа выполняется так, как если бы соответствующее данное в вызываемой программе занимало такую же область памяти, как и данное в вызывающей программе. Описание данного в вызываемой программе должно определять/такое же количество позиций литер, как и описание соответствующего данного в вызывающей программе.
Если для параметра задана или подразумевается фраза BY CONTENT (ЗНАЧЕНИЕ), вызываемая программа не может изменить значение этого параметра, указанного во фразе USING (ИСПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ), хотя вызываемая программа может изменить значение данного, представленного соответствующим именем данного в заголовке раздела процедур вызываемой программы. Описание данного для каждого параметра во фразе BY CONTENT (ЗНАЧЕНИЕ) оператора CALL (ВЫЗВАТЬ) должно быть таким же, как описание данного для соответствующего параметра во фразе USING (ИСПОЛЬЗУЯ) заголовка раздела процедур, т. е. не должно требоваться какого-либо преобразования, расширения или усечения (см. п. 5.1 настоящей-части).
Вызываемые программы могут содержать операторы CALL (ВЫЗВАТЬ). Однако вызываемая программа не должна выполнять оператор CALL (ВЫЗВАТЬ), который прямо или косвенно вызывает вызывающую программу. Если оператор CALL (ВЫЗВАТЬ) выполняется в области действия декларативні, one* ратор CALL (ВЫЗВАТЬ) не может прямо или косвенно обратиться к какой-либо вызываемой программе, которой было передано управление и выполнение которой еще не завершено.
Фраза END-CALL (КОНЕЦ-ВЫЗВАТЬ) ограничивает область действия оператора CALL (ВЫЗВАТЬ) (см. ч. 4, п. 7).
Оператор CANCEL (ОСВОБОДИТЬ)
Назначение
Оператор CANCEL (ОСВОБОДИТЬ) обеспечивает, что при следующем вызове названной программы она будет находиться в начальном состоянии.
О б'щ и й формат
CANCEL ( идентификатор-1 1
: 1 литерал-1 J
ОСВОБОДИТЬ ( идентификатор-1 1 .
— (литерал-1 J
С и н т а к с и ч е с к и е правила
Литерал-1 должен быть нечисловым.
Идентификатор-1 должен относиться к буквенно-цифровому данному.
Общие правила
Литерал-1 или содержимое данного, представленного идентификатором-1, идентифицирует программу, которая должна быть освобождена.
В результате выполнения явного или неявного оператора CANCEL (ОСВОБОДИТЬ) прекращается всякая логическая связь программы, которая указывается в нем, с единицей исполнения, в которой появляется оператор CANCEL (ОСВОБОДИТЬ). Если программа, названная в успешно выполненном в единице исполнения явном или неявном операторе CANCEL (ОСВОБОДИТЬ), позднее вызывается в этой же единице исполнения, эта программа находится в начальном состоянии (см. пп. 1.3.8, 2.4 и 5.2 настоящей части).
Программа, названная в операторе CANCEL (ОСВОБОДИТЬ) в другой программе, должна быть вызвана этой другой программой (см. пп. 1.3.8 и 5.2 настоящей части).
При выполнении явного или неявного оператора CANCEL (ОСВОБОДИТЬ) все программы, содержащиеся в программе, которая названа в операторе CANCEL (ОСВОБОДИТЬ), тоже освобождаются. Результат такой же, как если бы правильный оператор CANCEL (ОСВОБОДИТЬ) выполнялся для каждой содержащейся программы в последовательности, обратной той, в которой программы появляются в отдельно компили- руемой программе.
Программа, названная в операторе CANCEL (ОСВОБОДИТЬ), не должна прямо или косвенно обращаться к программе, которая была вызвана, но еще не выполнила оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ).
Логическая связь с освобожденной программой устанавливается только в результате выполнения следующего оператора CALL (ВЫЗВАТЬ), в котором названо имя этой программы.
Вызываемая программа освобождается посредством указания ее в качестве операнда оператора CANCEL (ОСВОБОДИТЬ), в результате завершения единицы исполнения, в состав которой входит данная программа, или в результате выполнения оператора EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) в вызываемой программе, имеющей атрибут «начальная».
Никаких действий не выполняется при выполнении явного пли неявного оператора CANCEL (ОСВОБОДИТЬ), называющего программу, которая не была вызвана в этой единице исполнения или была вызвана, но в настоящее время освобождена. Управление передается следующему выполнимому оператору после явного оператора CANCEL (ОСВОБОДИТЬ).
Содержимое данных во внешних записях данных, описанных в программе, не изменяется при освобождении этой программы.
Во время выполнения явного или неявного оператора CANCEL (ОСВОБОДИТЬ) выполняется неявный оператор CLOSE (ЗАКРЫТЬ) без всяких необязательных фраз для каждого файла в открытом состоянии, который связан с внутренним определителем файла в программе, названной в явном операторе CANCEL (ОСВОБОДИТЬ). Все процедуры USE (ИСПОЛЬЗОВАТЬ), относящиеся к любому из этих файлов, не выполняются.
Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ)
Назначение
Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) от» мечает логический конец вызываемой программы.
Общий формат ;
EXIT PROGRAM
ВЫЙТИ ИЗ ПРОГРАММЫ
С и н т а к с и ч е с к-и е правила
Если оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) появляется в последовательности повелительных операторов внутри предложения, он должен быть последним оператором в этой последовательности.Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ)- не должен появляться в декларативной процедуре, в которой указана фраза GLOBAL (ГЛОБАЛЬНО).
Общие правила
Если оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) выполняется в программе, которая не находится под управлением вызывающей программы, оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) вызывает продолжение выполнения программы со следующего выполнимого оператора.
Выполнение оператора EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) в вызываемой программе, которая не имеет атрибута «начальная», вызывает продолжение выполнения со следующего выполнимого оператора после оператора CALL (ВЫЗВАТЬ) в вызывающей программе. Состояние вызывающей программы не изменяется и идентично ее состоянию во время выполнения оператора CALL (ВЫЗВАТЬ). Исключение составляет только содержимое данных и файлов данных, совместно используемых вызываемой и вызывающей программами, которое могло быть изменено. Состояние вызываемой программы не изменяется, только считается, что достигнут конец области действия для всех операторов PERFORM (ВЫПОЛНИТЬ), выполняемых этой вызванной программой.
За исключением действий, перечисленных в общем правиле (2), выполнение оператора EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) в вызываемой программе с атрибутом «начальная» эквивалентно также выполнению оператора CANCEL (ОСВОБОДИТЬ), обращающегося к этой программе (см. п. 5.3 настоящей части).
Оператор USE (ИСПОЛЬЗОВАТЬ)
Назначение
В модуле межпрограммных связей оператор USE (ИСПОЛЬЗОВАТЬ) определяет, вызываются ли соответствующие декларативные процедуры во время выполнения любой программы, содержащейся в программе, в которой находится оператор USE (ИСПОЛЬЗОВАТЬ).
О
( EXCEPTION j ERROR
бщий форматUSE [GLOBAL] AFTER STANDARD
PROCEDURE
ON |
{имя-файла-1}... INPUT |
|
OUTPUT 1-0 EXTEND |
ИСПОЛЬЗОВАТЬ [ГЛОБАЛЬНО] ПОСЛЕ
СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ
{имя-файла-1}. .. |
В
для
ХОДНЫХ IВЫХОДНЫХ
ВХОДНЫХ-ВЫХОДНЫХ I
ДОПОЛНЯЕМЫХ I
С и н т а к с и ч е с к и е правила
Наличие нескольких имен-файлов и фразы EXTEND (ДОПОЛНЯЕМЫХ) зависит от уровня модуля последовательного ввода-вывода, относительного ввода-вывода или индексного ввода-вывода, обеспечиваемого реализацией (см. ч. 7, п. 5.6.4, ч. 8, п. 4.8, ч. 9, п. 4.8).
Общие правила
При вложении программы в другие программы соблюдаются специальные правила предшествования. При применении этих правил только первая уточняющая декларатива будет выбрана для выполнения. Декларатива, выбираемая для выполнения, должна удовлетворять правилам выполнения этой декла- ративы. Порядок предшествования для выбора декларативы таков:
декларатива внутри программы, которая содержит оператор, вызвавший уточняющее условие;
декларатива, в которой задана фраза GLOBAL (ГЛОБАЛЬНО) и которая находится в программе, прямо содержащей программу, которая была проверена последней на уточняющую декларативу;
любая декларатива, выбранная в результате применения правила 16 для каждой более объемлющей содержащей программы до тех пор, пока правило 16 не будет применено к наиболее объемлющей программе. Если уточняющая декларатива не найдена, ничего не выполняется.
Оператор USE BEFORE REPORTING (ИСПОЛЬЗОВАТЬ ДО ВЫДАЧИ)
Назначение
В модуле межпрограммных связей оператор USE BEFORE REPORTING (ИСПОЛЬЗОВАТЬ ДО ВЫДАЧИ) устанавливает, вызываются ли соответствующие декларативные процедуры во время выполнения любой программы, содержащейся в программе, в которой находится оператор USE BEFORE REPORTING (ИСПОЛЬЗОВАТЬ ДО ВЫДАЧИ).Общий формат
USE [GLOBAL] BEFORE REPORTING идентификатор-1 ИСПОЛЬЗОВАТЬ [ГЛОБАЛЬНО] ДО ВЫДАЧИ идентификатор-!
Синтаксические правила
Наличие оператора USE BEFORE REPORTING (ИСПОЛЬЗОВАТЬ ДО ВЫДАЧИ) зависит от того, обеспечивает ли данн-ая реализация модуль генератора отчетов (ч. 13, п. 4.8.2).
Общие правила
При вложении одних программ в другие программы соблюдаются специальные правила предшествования. При применении этих правил только первая декларатива будет выбрана для выполнения. Декларатива, выбираемая для выполнения, должна удовлетворять правилам выполнения этой декларативні. Порядок предшествования для выбора декларативы таков: