Механизм, используемый в этом примере, состоит в следую­щем:

  1. если одна из двух программ, имеющих одинаковое имя, которое указано в операторе CALL (ВЫЗВАТЬ), прямо содер­жится в программе, в которой находится оператор CALL (ВЫ­ЗВАТЬ), эта программа вызывается;

если одна из двух программ, имеющих одинаковое имя, которое указано в операторе CALL (ВЫЗВАТЬ), имеет атрибут «общая» и прямо содержится в другой программе, прямо или

■; косвенно содержащей программу, в которой находится оператор ; CALL (ВЫЗВАТЬ), вызывается эта общая программа, если ' только вызывающая программа не содержится в этой общей программе;

  1. в остальных случаях вызывается отдельно компилируемая •программа.

  1. I Если I вызываемая программа | не имеет атрибута «на­чальная», тогда она и каждая программа, прямо или косвенно содержащаяся в ней, | находятся в начальном состоянии при пер- вом вызове этой программы в единице исполнения |"^ при ее пер- вом вызове после оператора CANCEL (ОСВОБОДИТЬ) для вызываемой программы.

При всех остальных входах в вызываемую программу состояние этой программы и каждой программы, прямо или косвенно со- держащейся в ней, остается таким же, каким оно было во вре­мя последнего выхода из программы.

  1. Если вызываемая программа имеет атрибут «начальная», она и каждая программа, прямо или косвенно содержащаяся в ней, устанавливается в свое начальное состояние при каждом вызове вызываемой программы в единице исполнения.

  2. Файлы, связанные с внутренними определителями файлов вызываемой программы, не находятся в открытом состоянии, ког­да программа находится в начальном состоянии (см. п. 2.4 настоя­щей части).

При всех остальных входах в вызываемую программу состояние и позиционирование всех таких файлов такое, каким оно было при последнем выходе из вызываемой программы.

  1. Процесс вызова программы или выхода из вызываемой программы не изменяет состояние или позиционирование фай­ла, связанного с внешним определителем файла.

  2. Если вызываемая программа — это программа Кобола, фраза USING (ИСПОЛЬЗУЯ) включается в оператор CALL (ВЫ­ЗВАТЬ) только тогда, когда в заголовке раздела процедур вызы­ваемой программы имеется фраза USING (ИСПОЛЬЗУЯ); в этом случае количество операндов в каждой фразе USING (ИСПОЛЬ­ЗУЯ) должно быть одинаковым. Если вызываемая программа — это программа не на Коболе, использование фразы USING (ИС­ПОЛЬЗУЯ) определяется реализацией.

  3. Последовательность появления имен-данных во фразе USING (ИСПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ) и в соот-

S64

ветствующей фразе USING (ИСПОЛЬЗУЯ) в заголовке раздела процедур вызываемой 'программы устанавливает соответствие между именами-данных, используемыми в вызывающей и вызывае­мой программах. Это соответствие является позиционным, а не оп­ределяется эквивалентностью имен; первое имя-данного в одной фразе USING (ИСПОЛЬЗУЯ) соответствует первому имени-дан- ного во второй фразе, второе имя-данного в одной фразе соответст­вует второму имени данного во второй фразе USING (ИСПОЛЬ­ЗУЯ) и т. д.

  1. Значения параметров, названных во фразе USING (ИС­ПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ), становятся доступны­ми для вызываемой программы во время выполнения оператора CALL (ВЫЗВАТЬ).

  2. I Обе фразы BY CONTENT (ЗНАЧЕНИЕ) и BY REFE- . RENCE (ССЫЛКУ НА) распространяются на все параметры, следующие за ними, до тех пор, пока не встретится другая фра­за BY CONTENT (ЗНАЧЕНИЕ) или BY REFERENCE (ССЫЛ­КУ НА). Если перед первым параметром не задана ни фраза BY CONTENT (ЗНАЧЕНИЕ), ни BY REFERENCE (ССЫЛКУ НА), подразумевается фраза BY REFERENCE (ССЫЛКУ НА).

  3. Если для параметра | задана или | подразумевается фраза BY REFERENCE (ССЫЛКУ НА), объектная программа выполня­ется так, как если бы соответствующее данное в вызываемой про­грамме занимало такую же область памяти, как и данное в вызы­вающей программе. Описание данного в вызываемой программе должно определять/такое же количество позиций литер, как и опи­сание соответствующего данного в вызывающей программе.

  4. Если для параметра задана или подразумевается фра­за BY CONTENT (ЗНАЧЕНИЕ), вызываемая программа не мо­жет изменить значение этого параметра, указанного во фразе USING (ИСПОЛЬЗУЯ) оператора CALL (ВЫЗВАТЬ), хотя вызываемая программа может изменить значение данного, представленного соответствующим именем данного в заголовке раздела процедур вызываемой программы. Описание данного для каждого параметра во фразе BY CONTENT (ЗНАЧЕНИЕ) оператора CALL (ВЫЗВАТЬ) должно быть таким же, как опи­сание данного для соответствующего параметра во фразе USING (ИСПОЛЬЗУЯ) заголовка раздела процедур, т. е. не должно требоваться какого-либо преобразования, расширения или усечения (см. п. 5.1 настоящей-части).

Вызываемые программы могут содержать операторы CALL (ВЫЗВАТЬ). Однако вызываемая программа не должна выполнять оператор CALL (ВЫЗВАТЬ), который прямо или кос­венно вызывает вызывающую программу. Если оператор CALL (ВЫЗВАТЬ) выполняется в области действия декларативні, one* ратор CALL (ВЫЗВАТЬ) не может прямо или косвенно обратить­ся к какой-либо вызываемой программе, которой было передано управление и выполнение которой еще не завершено.

  1. Фраза END-CALL (КОНЕЦ-ВЫЗВАТЬ) ограничивает об­ласть действия оператора CALL (ВЫЗВАТЬ) (см. ч. 4, п. 7).

  1. Оператор CANCEL (ОСВОБОДИТЬ)

    1. Назначение

Оператор CANCEL (ОСВОБОДИТЬ) обеспечивает, что при следующем вызове названной программы она будет находиться в начальном состоянии.

  1. О б'щ и й формат

CANCEL ( идентификатор-1 1

: 1 литерал-1 J

ОСВОБОДИТЬ ( идентификатор-1 1 .

— (литерал-1 J

  1. С и н т а к с и ч е с к и е правила

  1. Литерал-1 должен быть нечисловым.

  2. Идентификатор-1 должен относиться к буквенно-цифро­вому данному.

  1. Общие правила

  1. Литерал-1 или содержимое данного, представленного идентификатором-1, идентифицирует программу, которая долж­на быть освобождена.

  2. В результате выполнения явного или неявного операто­ра CANCEL (ОСВОБОДИТЬ) прекращается всякая логическая связь программы, которая указывается в нем, с единицей испол­нения, в которой появляется оператор CANCEL (ОСВОБО­ДИТЬ). Если программа, названная в успешно выполненном в единице исполнения явном или неявном операторе CANCEL (ОСВОБОДИТЬ), позднее вызывается в этой же единице ис­полнения, эта программа находится в начальном состоянии (см. пп. 1.3.8, 2.4 и 5.2 настоящей части).

  3. Программа, названная в операторе CANCEL (ОСВОБО­ДИТЬ) в другой программе, должна быть вызвана этой другой программой (см. пп. 1.3.8 и 5.2 настоящей части).

  4. При выполнении явного или неявного оператора CAN­CEL (ОСВОБОДИТЬ) все программы, содержащиеся в прог­рамме, которая названа в операторе CANCEL (ОСВОБОДИТЬ), тоже освобождаются. Результат такой же, как если бы пра­вильный оператор CANCEL (ОСВОБОДИТЬ) выполнялся для каждой содержащейся программы в последовательности, обрат­ной той, в которой программы появляются в отдельно компили- руемой программе.

  5. Программа, названная в операторе CANCEL (ОСВОБО­ДИТЬ), не должна прямо или косвенно обращаться к програм­ме, которая была вызвана, но еще не выполнила оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ).

  6. Логическая связь с освобожденной программой устанав­ливается только в результате выполнения следующего операто­ра CALL (ВЫЗВАТЬ), в котором названо имя этой программы.

  7. Вызываемая программа освобождается посредством указания ее в качестве операнда оператора CANCEL (ОСВО­БОДИТЬ), в результате завершения единицы исполнения, в сос­тав которой входит данная программа, или в результате выпол­нения оператора EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) в вызываемой программе, имеющей атрибут «начальная».

  8. Никаких действий не выполняется при выполнении явно­го пли неявного оператора CANCEL (ОСВОБОДИТЬ), называ­ющего программу, которая не была вызвана в этой единице ис­полнения или была вызвана, но в настоящее время освобожде­на. Управление передается следующему выполнимому операто­ру после явного оператора CANCEL (ОСВОБОДИТЬ).

  9. Содержимое данных во внешних записях данных, опи­санных в программе, не изменяется при освобождении этой программы.

  10. Во время выполнения явного или неявного оператора CANCEL (ОСВОБОДИТЬ) выполняется неявный оператор CLOSE (ЗАКРЫТЬ) без всяких необязательных фраз для каж­дого файла в открытом состоянии, который связан с внутренним определителем файла в программе, названной в явном операто­ре CANCEL (ОСВОБОДИТЬ). Все процедуры USE (ИСПОЛЬ­ЗОВАТЬ), относящиеся к любому из этих файлов, не выполня­ются.

  1. Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ)

    1. Назначение

Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) от» мечает логический конец вызываемой программы.

  1. Общий формат ;

EXIT PROGRAM

ВЫЙТИ ИЗ ПРОГРАММЫ

  1. С и н т а к с и ч е с к-и е правила

  1. Если оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАМ­МЫ) появляется в последовательности повелительных операторов внутри предложения, он должен быть последним оператором в этой последовательности.Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ)- не должен появляться в декларативной процедуре, в которой ука­зана фраза GLOBAL (ГЛОБАЛЬНО).

  1. Общие правила

  1. Если оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАМ­МЫ) выполняется в программе, которая не находится под управле­нием вызывающей программы, оператор EXIT PROGRAM (ВЫЙ­ТИ ИЗ ПРОГРАММЫ) вызывает продолжение выполнения прог­раммы со следующего выполнимого оператора.

  2. Выполнение оператора EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) в вызываемой программе, которая не имеет атри­бута «начальная», вызывает продолжение выполнения со следую­щего выполнимого оператора после оператора CALL (ВЫЗВАТЬ) в вызывающей программе. Состояние вызывающей программы не изменяется и идентично ее состоянию во время выполнения опера­тора CALL (ВЫЗВАТЬ). Исключение составляет только содержи­мое данных и файлов данных, совместно используемых вызывае­мой и вызывающей программами, которое могло быть изменено. Состояние вызываемой программы не изменяется, только считает­ся, что достигнут конец области действия для всех операторов PERFORM (ВЫПОЛНИТЬ), выполняемых этой вызванной про­граммой.

  3. За исключением действий, перечисленных в общем пра­виле (2), выполнение оператора EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) в вызываемой программе с атрибутом «началь­ная» эквивалентно также выполнению оператора CANCEL (ОС­ВОБОДИТЬ), обращающегося к этой программе (см. п. 5.3 нас­тоящей части).

  1. Оператор USE (ИСПОЛЬЗОВАТЬ)

    1. Назначение

В модуле межпрограммных связей оператор USE (ИСПОЛЬ­ЗОВАТЬ) определяет, вызываются ли соответствующие декла­ративные процедуры во время выполнения любой программы, содержащейся в программе, в которой находится оператор USE (ИСПОЛЬЗОВАТЬ).

  1. О

    ( EXCEPTION j ERROR

    бщий формат

USE [GLOBAL] AFTER STANDARD

PROCEDURE

ON

{имя-файла-1}... INPUT


OUTPUT 1-0 EXTEND



ИСПОЛЬЗОВАТЬ [ГЛОБАЛЬНО] ПОСЛЕ

СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ

{имя-файла-1}. .. |

В

для

ХОДНЫХ I

ВЫХОДНЫХ

ВХОДНЫХ-ВЫХОДНЫХ I

ДОПОЛНЯЕМЫХ I

  1. С и н т а к с и ч е с к и е правила

  1. Наличие нескольких имен-файлов и фразы EXTEND (ДОПОЛНЯЕМЫХ) зависит от уровня модуля последователь­ного ввода-вывода, относительного ввода-вывода или индексно­го ввода-вывода, обеспечиваемого реализацией (см. ч. 7, п. 5.6.4, ч. 8, п. 4.8, ч. 9, п. 4.8).

  1. Общие правила

  1. При вложении программы в другие программы соблюда­ются специальные правила предшествования. При применении этих правил только первая уточняющая декларатива будет вы­брана для выполнения. Декларатива, выбираемая для выпол­нения, должна удовлетворять правилам выполнения этой декла- ративы. Порядок предшествования для выбора декларативы таков:

  1. декларатива внутри программы, которая содержит опера­тор, вызвавший уточняющее условие;

  2. декларатива, в которой задана фраза GLOBAL (ГЛО­БАЛЬНО) и которая находится в программе, прямо содержа­щей программу, которая была проверена последней на уточня­ющую декларативу;

  3. любая декларатива, выбранная в результате применения правила 16 для каждой более объемлющей содержащей прог­раммы до тех пор, пока правило 16 не будет применено к наи­более объемлющей программе. Если уточняющая декларатива не найдена, ничего не выполняется.

  1. Оператор USE BEFORE REPORTING (ИСПОЛЬЗО­ВАТЬ ДО ВЫДАЧИ)

    1. Назначение

    2. В модуле межпрограммных связей оператор USE BEFORE REPORTING (ИСПОЛЬЗОВАТЬ ДО ВЫДАЧИ) устанавлива­ет, вызываются ли соответствующие декларативные процедуры во время выполнения любой программы, содержащейся в прог­рамме, в которой находится оператор USE BEFORE REPOR­TING (ИСПОЛЬЗОВАТЬ ДО ВЫДАЧИ).Общий формат

USE [GLOBAL] BEFORE REPORTING идентификатор-1 ИСПОЛЬЗОВАТЬ [ГЛОБАЛЬНО] ДО ВЫДАЧИ иденти­фикатор-!

  1. Синтаксические правила

  1. Наличие оператора USE BEFORE REPORTING (ИС­ПОЛЬЗОВАТЬ ДО ВЫДАЧИ) зависит от того, обеспечивает ли данн-ая реализация модуль генератора отчетов (ч. 13, п. 4.8.2).

  1. Общие правила

  1. При вложении одних программ в другие программы соб­людаются специальные правила предшествования. При приме­нении этих правил только первая декларатива будет выбрана для выполнения. Декларатива, выбираемая для выполнения, должна удовлетворять правилам выполнения этой декларативні. Порядок предшествования для выбора декларативы таков: