Перейти до вмісту
ГОСТ 22558-89
/ 116

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

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

если одна из двух программ, имеющих одинаковое имя, которое указано в операторе 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 настоящей части).

При выполнении явного или неявного оператора CAN­CEL (ОСВОБОДИТЬ) все программы, содержащиеся в прог­рамме, которая названа в операторе 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 не будет применено к наи­более объемлющей программе. Если уточняющая декларатива не найдена, ничего не выполняется.

Побачили розбіжність з офіційним текстом?

Повідомити про неточність

Напишіть, що саме розходиться з офіційною публікацією. Код документа вкажіть у повідомленні — так ми швидше знайдемо потрібне місце.

Перейти до форми зворотного зв'язку

Дивіться також

Весь розділ →