Справочное руководство по языку Ада-83

         

Функции


Функция — это подпрограмма, которая возвращает значение (результат вызова функции). Спецификация функции начинается с зарезервированного слова function, а параметры, если они есть, должны иметь вид in (указанный явно или неявно). Операторы тела функции (исключая операторы программных модулей, вложенных в тело функции) должны содержать один или несколько операторов возврата, -определяющих возвращаемое значение.

Исключение PROGRAM - ERROR возбуждается, если выход из тела функции осуществляется не через оператор возврата. Это исключение не возбуждается, если выполнение функции прекращается в результате исключения.

Пример:

function DOTPRODUCT(LEFT, RIGHT : VECTOR) return REAL is SUM : REAL := 0.0; begin CHECK(LEFT'FIRST = RIGHT'FIRST and LEFT'LAST = RIGHT'LAST); for J in LEFT'RANGE loop SUM := SUM + LEFT(J)*RIGHT(J); end loop; return SUM;

end DOTPRODUCT;

Ссылки: вид 6.1, возбуждение исключений 11, вызов функции 6.4, исключение 11, исключение PROGRAM_ERROR 11.1, оператор 5, оператор возврата 5.8, спецификация функции 6.1, тело функции 6.3, формальный параметр 6.1, функция



Подпрограммы


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

Подпрограмма — это программный модуль, выполнение которого инициируется вызовом подпрограммы. Существуют две формы подпрограмм: процедуры и функции. Вызов процедуры — это оператор; вызов функции является выражением. Вызов функции возвращает значение. Определение подпрограммы может состоять из двух частей: описания подпрограммы, определяющего соглашения о ее вызове, и тела подпрограммы, определяющего ее выполнение.

Ссылки: вызов подпрограммы 6.4, вызов процедуры 6.4, вызов функции 6.4, задачный модуль 9, настраиваемый модуль 12, описание подпрограммы 6.1, пакет 7, процедура 6.1, тело подпрограммы 6.3, функция



Описание подпрограммы


Описание подпрограммы объявляет процедуру или функцию в зависимости от указанного начального зарезервированного слова.

описание-подпрограммы ::= спецификация-подпрограммы;спецификация - подпрограммы ::= procedure идентификатор [раздел-формальных-параметров] | function обозначение [раздел-формальных-параметров] return обозначение-типаобозначение ::= идентификатор | знак-операции знак-операции ::= строковый-литералраздел-формальных-параметров ::= (спецификация-параметра {; спецификация-параметра})спецификация-параметра ::= список-идентификаторов : вид обозначение-типа [:= выражение]вид ::= [in] | in out | out

Спецификация процедуры определяет ее идентификатор и ее формальные параметры (если они есть). Спецификация функции определяет ее обозначение, ее формальные параметры (если они есть) и подтип возвращаемого значения ( подтип результата). Обозначение, являющееся знаком операции, используется для совмещения операций. Последовательность символов, представляющая знак операции, должна представлять операцию, принадлежащую одному из шести классов совмещаемых операций, определенных в разд. 4.5 (пробелы недопустимы, а относительно букв ограничений нет).

Спецификация параметра с несколькими идентификаторами эквивалентна последовательности спецификаций с одним параметром, как поясняется в разд. Каждая спецификация одного параметра описывает формальный параметр. Если вид явно не задан, то предполагается вид in. Если спецификация параметра оканчивается выражением, то оно является выражением по умолчанию формального параметра. Выражение по умолчанию допустимо только в спецификации параметра вида in (независимо от явного или неявного его указания). Тип выражения по умолчанию должен совпадать с типом соответствующего формального параметра.

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

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

Примеры описания подпрограмм:

procedure TRAVERSE_TREE; procedure INCREMENT(X : in out INTEGER); procedure RIGHTINDENT(MARGIN : out LINESIZE); -- CM. 4 procedure SWITCH(FROM, TO : in out LINK); -- CM. 1function RANDOM return PROBABILITY; -- CM. 7 function MINCELL(X : LINK) return CELL; -- CM. 1 function NEXTFRAME(K : POSITIVE) return FRAME; -- CM. 3.8 function DOTPRODUCT(LEFT,RIGHT: VECTOR) return REAL; -- CM. 3.6function"*"(LEFT,RIGHT : MATRIX) return MATRIX; -- CM. 3.6

Примеры параметров с выражениями по умолчанию:

procedure PRINT_HEADER( PAGES : in NATURAL; HEADER : in LINE := (1 .. LINE'LAST => ' '); -- CM. 3.6 CENTER : in BOOLEAN := TRUE);

Примечание. Вычисление выражений по умолчанию начинается при определенных вызовах подпрограмм, как пояснено в разд. 2 (выражения по умолчанию не вычисляются при предвыполнении описания подпрограммы).

Все подпрограммы могут быть вызваны рекурсивно и являются реентерабельными. Ссылки: вид 6.2, вызов подпрограммы 6.4, выражение 4.4, вычисление 4.5, идентификатор 2.3, имя 4.1, обозначение типа 2, операция 4.5, описание 3.1, Предвыполнение 3.9, пред-выполнение не имеет другого эффекта 3.9, процедура 6, совмещение 6.6, 8.7, список идентификаторов 3.2, строковый литерал 2.6, формальный параметр 6.2, функция



выражение по умолчанию для формального



Примечание

function "+" (LEFT, RIGHT : MATRIX) return MATRIX; function "+" (LEFT, RIGHT : VECTOR) return VECTOR;-- в предположении, что А, В и С типа VECTOR -- три следующих присваивания эквивалентныА := B + С;А := "+"(В, С); А := "+"(LEFT => В, RIGHT => С); Ссылки: бинарная аддитивная операция 4.5, 3, видимый по именованию 8.3, выражение по умолчанию для формального параметра 6.1, дополнительный результат 2, допустимо 1.6, знак операции 6.1, лимитируемый тип 4, логическая операция 4.5, 1, логический предопределенный тип 3, мультипликативная операция 4.5, 5, непосредственно видимо 8.3, неявное описание 3.1, обозначение 6.1, операция 4.5, операция высшего приоритета 4.5, 6, операция неравенства 2, операция отношения 4.5, 2, операция равенства 4.5, описание 3.1, описание функции 6.1, определение типа 1, проверка вхождения 4.5, 2, символ 2.1, совмещение 6.6, 8.7, унарная аддитивная операция 4.5, 4, фактический параметр 1, форма управления с промежуточной проверкой 4.5, 1, формальный параметр

Профиль типа параметров и результата. Совмещение подпрограмм


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

Один и тот же идентификатор подпрограммы или знак операции может быть использован для нескольких спецификаций подпрограмм. В этом случае идентификатор или знак операции называется совмещенным; подпрограммы, которые имеют этот идентификатор или знак операции, тоже называются совмещенными и, следовательно, могут совмещаться друг с другом. Как поясняется в разд. 8.3, если две подпрограммы совмещаются друг с другом, то одна из них может скрыть другую, только если обе подпрограммы имеют одинаковый профиль типа параметров и результата [6] (см. 8.3, где описаны другие требования, необходимые для скрытия).

Вызов совмещенной подпрограммы неоднозначен (и поэтому неправилен), если ее имя, число сопоставлений параметров, типы и порядок фактических параметров, имена формальных параметров (при использовании именованных сопоставлений параметров) и тип результата (для функций) не позволяют идентифицировать единственную (совмещенную) спецификацию подпрограммы.

Примеры совмещенных подпрограмм:

procedure PUT(X : INTEGER»; procedure PUT(X : STRING); procedure SET(TINT : COLOR); procedure SET(SIGNAL : LIGHT);

Примеры вызовов:

PUT(28); PUT("no possibte ambiguity here"); SET(TINT => RED»: SET(SIGNAL => RED); SET(COLOR'(RED));-- SET (RED) может быть неоднозначным, так как -- может обозначать значение типа COLOR и типа

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

Неоднозначности могут (но не обязательно) также возникнуть, когда фактические параметры вызова совмещенной подпрограммы сами являются вызовами совмещенной функции, совмещенными литералами или агрегатами.

Неоднозначности могут (но не обязательно) также возникнуть, когда видимы несколько совмещенных подпрограмм, принадлежащих различным пакетам. Этих неоднозначностей можно избежать несколькими способами: использовать квалифицированные выражения для некоторых или для всех фактических параметров и результата, если он есть; имя такой подпрограммы можно задавать более точно расширенным именем; наконец, такая подпрограмма может быть переименована.

Ссылки: агрегат 4.3, базовый тип 3.3, вид 6.1, вход 9.5, вызов функции 6.4, выражение по умолчанию для формального параметра 6.1, знак операции 6.1, идентификатор 2.3, именованное сопоставление параметров 6.4, квалифицированное выражение 4.7, литерал 4.2, неправильный 1.6, описание переименования 8.5, пакет 7, параметр подпрограммы 6.2, подпрограмма 6, подтип 3.3, подтип результата 6.1, скрытие 8.3, совмещение 8.7, спецификация подпрограммы 6.1, тип 3.3, фактический параметр 1, формальный параметр 6.1, функция


[6] 1) Имеется в виду, что обе подпрограммы имеют разные зоны описания. - Прим. ред.



Совмещение операций


Описание функции, обозначение которой является знаком операции, используется для совмещения операций. Последовательность символов в знаке операции должна быть обозначением операции: логической, отношения, бинарной аддитивной, унарной аддитивной, мультипликативной или высшего приоритета (см. 4.5). В качестве обозначения функции не допускаются никакие проверки вхождения, ни формы управления с промежуточной проверкой.

Спецификация подпрограммы унарной операции должна иметь один-единственный параметр. Спецификация подпрограммы бинарной операции должна иметь два параметра; при каждом использовании этой операции левый операнд берется в качестве первого фактического параметра, правый операнд — в качестве второго параметра; конкретизация настройки функции, которая обозначена знаком операции, допускается, только если спецификация настраиваемой функции имеет соответствующее число параметров. Выражения по умолчанию для параметров операции недопустимы (описана ли операция явно спецификацией подпрограммы или конкретизацией настройки).

Операции + и - допускают как унарную, так и бинарную совмещенную операцию.

Явное описание функции, которая совмещает операцию =, отличное от описания переименования, допустимо, только если оба параметра являются параметрами одного и того же лимитируемого типа. Совмещение равенства должно давать результат предопределенного типа BOOLEAN; операция неравенства /=, дающая результат, дополнительный к результату операции равенства, совмещается неявно при задании операции равенства. Явное совмещение операции неравенства недопустимо.

Описание переименования, обозначение которого — операция равенства, допустимо только для переименования другой операции равенства. (Например, такое описание переименования может быть использовано, когда равенство видимо по имени, но не непосредственно.)

Примечание. Совмещение операций отношения не нарушает соотношений, таких как проверка вхождения в диапазон или выборы в операторе выбора.



Тела подпрограмм


Тело подпрограммы определяет ее выполнение.

тело-подпрограммы ::= спецификация-подпрограммы is [раздел - описаний] begin последовательность-операторов [exception обработчик - исключения {обработчик-исключения}] end [обозначение];

Описание подпрограммы необязательно. При отсутствии описания спецификация подпрограммы в ее теле (или в следе тела) играет роль описания. Для каждого описания подпрограммы должно быть соответствующее тело (кроме подпрограмм, написанных на другом языке, как поясняется в разд. 13.9). Если даны и описание, и тело, то спецификация подпрограммы в теле должна быть согласована со спецификацией подпрограммы в описании (см. разд. 1 о правилах согласования).

Если в конце тела подпрограммы присутствует обозначение, то оно должно совпадать с обозначением в спецификации подпрограммы.

Предвыполнение тела подпрограммы не имеет никакого другого эффекта, кроме установления факта, что тело может быть использовано для выполнения вызовов подпрограммы.

Выполнение тела подпрограммы инициируется вызовом подпрограммы (см. 6.4). Для этого после установления соответствия между формальными и фактическими параметрами предвы-полняется раздел описаний тела и выполняется последовательность операторов тела подпрограммы. По окончании выполнения тела осуществляется возврат в место вызова (и необходимое обратное копирование значений формальных параметров в фактические (см. 6.2)). Необязательные обработчики исключений, заданные в конце тела подпрограммы, выполняются при возбуждении исключений во время выполнения последовательности операторов тела подпрограммы (см. 11.4).

Примечание. Из правил видимости следует, что если описанная в пакете подпрограмма обязана быть видимой вне пакета, то спецификация подпрограммы должна быть дана в видимой части пакета. Эти же правила предписывают, что описание подпрограммы должно быть дано, если вызов подпрограммы возникает текстуально до тела подпрограммы (описание должно помещаться в тексте программы раньше вызова). Данные в разд. 3.9 и 7.1 правила подразумевают, что описание подпрограммы и соответствующее тело должны находиться непосредственно в одной и той же зоне описаний.

Пример тела подпрограммы:

procedure PUSH(E : in ELEMENT.TYPE; S : in out STACK) ) is begin if S.INDEX = S.SIZE then raise STACK-OVERFLOW; else S.INDEX := S.INDEX + 1; S.SPACE(S.INDEX) := E; end if; end PUSH;

Ссылки: видимость 8.3, видимый раздел 7.2, вызов подпрограммы 6.4, зона описаний 8.1, исключение 11, находится непосредственно в 8.1, обозначение 6.1, обработчик исключения 11.2, описание 3.1, описание подпрограммы 6.1, пакет 7, подпрограмма 6, последовательность операторов 5.1, Предвыполнение 3.9, Предвыполнение не имеет другого эффекта 3.1, раздел описаний 3.9, след тела 10.2, согласованный 1, спецификация подпрограммы 6.1, фактический параметр 1, формальный параметр

1. ПРАВИЛА СОГЛАСОВАНИЯ

Всякий раз, когда правила языка требуют или допускают появления спецификации данной подпрограммы более одного раза, в каждом месте допустимы следующие вариации:

•Числовой литерал может быть заменен другим числовым литералом тогда и только тогда, когда они имеют одно и то же значение.

• Простое имя может быть заменено расширенным именем, в котором это простое имя является постфиксом тогда и только тогда, когда смысл простого имени в обоих случаях определяется одним и тем же описанием.

• Строковый литерал в качестве знака операции может быть заменен на другой строковый литерал тогда и только тогда, когда они представляют одну и ту же операцию (см. 8.5).

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

Аналогичное согласование определяется для разделов формальных параметров, разделов дискриминантов и обозначений типов (для субконстант и фактических параметров, которые имеют форму преобразования типа (см. 1)).

Примечание. Простое имя может быть заменено на расширенное имя, даже если простое имя само является префиксом именуемой компоненты. Например, Q.R может быть заменено на P.Q.R, если. Q описано непосредственно в Р.

Следующие спецификации не согласуются, так как они сформированы различными последовательностями лексем:

procedure P(X.Y : INTEGER) procedure P(X : INTEGER; Y : INTEGER) procedure P(X.Y : in INTEGER)

Ссылки: видимость 8.3, допустимый 1.6, знак операции 6.1, именуемая компонента 3, имя 4.1, комментарий 2.7, лексема 2, непосредственная видимость 8.3, описание 3.1, постфикс 3, преобразование типа 4.6, префикс 4.1, простое имя 4.1, раздел дискриминантов 1, раздел формальных параметров 6.1, расширенное имя 3, совмещение 6.6, 8.7, спецификация подпрограммы 6.1, субконстанта 3, фактический параметр 6.4, 1, числовой литерал

2. ПОДСТАНОВКА ПОДПРОГРАММ

Прагма INLINE используется для указания того факта, что для каждого вызова каждого указанного в прагме имени подпрограммы желательна подстановка тела соответствующей подпрограммы. Форма этой прагмы следующая:

pragma INLINE (имя (, имя));

Каждое имя — это либо имя подпрограммы, либо имя настраиваемой подпрограммы. Прагма INLINE допустима только на месте элемента описания в разделе описаний или спецификации пакета либо после библиотечного модуля в компиляции, но до любого следующего компилируемого модуля.

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

Смысл подпрограммы не изменяется прагмой INLINE. Для каждого вызова заданных в прагме подпрограмм реализация может выполнять или игнорировать рекомендации прагмы. (Заметим, в частности, что подстановка не может быть выполнена для рекурсивных подпрограмм.)

Ссылки: библиотечный модуль 10.1, вызоё подпрограммы 6.4, допустимый 1.6, имя 4.1, компилируемый модуль 10.1, компиляция 10.1, конкретизация 12.3, настраиваемая подпрограмма 12.1, настраиваемый модуль 12, 12.1, подпрограмма 6, прагма 2.8, раздел описаний 3.9, совмещение 6.6, 8.7, спецификация пакета 7.1, тело подпрограммы 6.3, элемент описания



Виды формальных параметров


Говорят, что значение объекта читается, когда это значение вычисляется; оно также читается, когда читается одна из его подкомпонент. Говорят, что значение переменной изменяется, когда выполняется присваивание этой переменной, а также (косвенно) когда эта переменная используется в качестве фактического параметра оператора вызова подпрограммы или оператора вызова входа, которые изменяют ее значение; говорят также, что оно изменяется, когда изменяется одна из его подкомпонент.

Формальный параметр подпрограммы бывает одного из следующих трех видов:

in Формальный параметр — константа, разрешается только чтение значения соответствующего фактического параметра.
in out Формальный параметр — переменная, разрешается как чтение, так и изменение значения соответствующего фактического параметра.
out Формальный параметр — переменная, разрешается изменение значения соответствующего фактического параметра. Значение скалярного параметра, которое не изменяется при вызове, после возврата не определено; то же самое имеет место для значения скалярной подкомпоненты, отличной от дискриминанта. Допускается чтение границ и дискриминантов формального параметра и его подкомпонент; никакое другое чтение не допускается.

Для скалярного параметра такой эффект достигается копированием: в начале каждого вызова значение фактического параметра, соответствующего формальному параметру вида inили in out, копируется в этом формальном параметре (прямое копирование); затем после нормального окончания тела подпрограммы значение формального параметра вида in out или out копируется обратно в соответствующем фактическом параметре (обратное копирование). Для параметра ссылочного типа прямое копирование используется для всех трех видов, а обратное — для видов in out и out.

Для параметров индексируемого, именуемого или задачного типов реализация может достигнуть такого же эффекта копированием, как и для скалярных типов. Кроме того, если копирование используется для параметра вида out, то прямое копирование требуется по крайней мере для границ и дискриминантов фактического параметра и его подкомпонент, а также для каждой подкомпоненты ссылочного типа. Другой вариант — вызов ссылкой, когда каждое использование формального параметра (чтение или изменение его значения) рассматривается как использование соответствующего фактического параметра при выполнении вызова подпрограммы. В языке не определяется, какой из этих двух механизмов следует применять для передачи параметров; не определяется также, что различные вызовы одной и той же подпрограммы должны использовать один и тот же механизм. Выполнение программы ошибочно, если ее результат зависит от механизма, выбираемого реализацией.

Для параметра личного типа вышеуказанный эффект достигается по правилу, которое применяется к соответствующему полному описанию типа.

В теле подпрограммы формальный параметр отвечает любому ограничению, вытекающему из обозначения типа, данного в спецификации этого параметра. В качестве границ формального параметра неограниченного индексируемого типа берутся границы фактического параметра (см. 2). Для формального параметра, описание которого задает неограниченный (личный или именуемый) тип с дискриминантами, дискриминанты этого формального параметра инициализируются значениями соответствующих дискриминантов фактического параметра; формальный параметр не ограничен тогда и только тогда, когда его вид in out или out и имя переменной, являющейся фактическим параметром, обозначает неограниченную переменную (см. 1 и 1).

Если фактический параметр вызова подпрограммы является подкомпонентой, которая зависит от дискриминантов переменной неограниченного именуемого типа, то выполнение вызова ошибочно, если значение любого дискриминанта переменной изменяется при этом выполнении; это правило не применяется, если вид параметра in и тип подкомпоненты — скалярный тип или ссылочный тип.

Примечание. Из правил передачи параметров индексируемого и именуемого типов следует:

• Если выполнение подпрограммы прекращено в результате исключения, конечное значение фактического параметра такого типа может быть либо тем же, что и до вызова, либо значением, присвоенным формальному параметру во время выполнения подпрограммы.

• Если доступ ко всем фактическим параметрам такого типа осуществляется одним способом, то результат вызова подпрограммы (при отсутствии исключения) не зависит от того, использует ли реализация для передачи параметров копирование. Если, однако, доступ к фактическому параметру осуществляется несколькими способами (например, если глобальная переменная или другой формальный параметр ссылается на один и тот же фактический параметр), то значение формального параметра после изменения фактического способом, отличным от изменения формального, неопределенно. Программа, использующая такое неопределенное значение, является ошибочной.

Такие же виды параметров определены и для формальных параметров входов (см. 9.5) с тем же смыслом, что и для подпрограмм. Для формальных параметров настройки определены другие виды параметров (см. 1).

Для всех видов справедливо, что если фактический параметр указывает задачу, то соответствующий формальный параметр указывает ту же задачу; то же самое имеет место для подкомпоненты фактического параметра и соответствующей подкомпоненты формального параметра.

Ссылки: вид 6.1, выражение 4.4, вычисление 4.5, глобальный 8.1, граница массива 1, дискриминант 1, зависеть от дискриминанта 1, задача 9, задачный тип 9.2, именуемый тип 3.7, индексируемый тип 3.6, исключение 11, личный тип 7.4, неограниченная переменная 1, неограниченный индексируемый тип 3.6, неограниченный тип с дискриминантами 1, обозначение типа 2, объект 3.2, ограничение 3.3, оператор вызова входа 9.5, операторвызова подпрограммы 6.4, ошибочный 1.6, переменная 1, подкомпонента 3.3, присваивание 5.2, скалярный тип 3.5, спецификация параметра 6.1, ссылочное значение null 3.8, ссылочный тип 3.8, тело подпрограммы 6.3, фактический параметр 1, формальный параметр 6.1, формальный параметр настройки



Вызовы подпрограмм


Вызов подпрограммы — это либо оператор вызова процедуры, либо вызов функции; он вызывает выполнение соответствующего тела подпрограммы. Вызов определяет связь фактических параметров, если они есть, с формальными параметрами подпрограммы.

оператор-вызова-процедуры ::= имя-процедуры [раздел - фактических - параметров]; вызов функции ::= имя-функции [раздел - фактических - параметров]раздел-фактических-параметров ::= (сопоставление-параметров {, сопоставление-параметров})сопоставление - параметров ::= [формальный-параметр =>] фактический-параметрформальный-параметр ::= простое-имя-параметрафактический-параметр ::= выражение | имя-переменной | обозначение-типа (имя-переменной)

Каждое сопоставление параметров связывает фактический параметр с соответствующим формальным параметром. Сопоставление параметров называется именованным, если формальный параметр указан явно, в противном случае оно называется позиционным. Для позиционного сопоставления фактический параметр соответствует формальному параметру в той же позиции раздела формальных параметров.

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

Для каждого формального параметра подпрограммы вызов подпрограммы должен задавать точно один соответствующий фактический параметр. Этот фактический параметр определяется либо явно сопоставлением параметра, либо в отсутствие такого сопоставления выражением по умолчанию (см. 2).

Сопоставления параметров вызова подпрограммы вычисляются в некотором порядке, не определенном в языке. Аналогично правила языка не определяют, в каком порядке значения параметров вида in out или out копируются обратно в соответствующих фактических параметрах (если это делается).

Примеры вызовов процедур:

TRAVERSE_TREE; -— СМ. 6.1 TABLE_MANAGER.INSERT(E); -— 7.5 PRINT_HEADER(128, TITLE, TRUE); —- см. 6.1SWITCH(FROM => X, TO => NEXT); -— CM. 6.1 PRINT_HEADER(128, HEADER => TITLE, CENTER => TRUE); -— CM. 6.1 PRINT_HEADER(HEADER => TITLE, CENTER => TRUE, PAGES => 128); -— CM. 6.1

Примеры вызовов функций:

DOTPRODUCT(U, V) -— см. 6.1 и 6.5 CLOCK —- см. 9.6

Ссылки: выражение 4.4, выражение по умолчанию для формального параметра 6.1, имя 4.1, обозначение типа 2, ошибочный 1.6, переменная 1, подпрограмма 6, простое имя 4.1, раздел формальных параметров 6.1, формальный параметр

1. СОПОСТАВЛЕНИЯ ПАРАМЕТРОВ

Тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра.

Фактический параметр, сопоставляемый с формальным параметром вида in, должен быть выражением; оно вычисляется до вызова.

Фактический параметр, сопоставляемый с формальным параметром вида in out или out, должен быть либо именем переменной, либо иметь форму преобразования типа с аргументом^ являющимся именем переменной. В любом случае для параметра вида in out переменная не должна быть формальным параметром вида out или подкомпонентой такого параметра. Для фактического параметра, который имеет форму преобразования типа, обозначение типа должно быть согласовано (см. 1) с обозначением типа формального параметра; допустимый операнд и целевой тип такие же, как и для преобразования типа (см. 4.6).

Данное для фактического параметра вида in out или out имя переменной вычисляется до вызова. Если фактический параметр имеет форму преобразования типа, то перед вызовом для параметра вида in out переменная преобразуется к заданному типу; после (нормального) окончания тела подпрограммы формальные параметры вида in out или out преобразуются обратно в тип переменной. (Тип преобразования должен быть тем же, что и у формального параметра.)

Для параметров скалярного и ссылочного типов проверяются следующие ограничения:

• Перед вызовом для параметра вида in или in out проверяется принадлежность фактического параметра подтипу формального параметра.

• После (нормального) окончания тела подпрограммы для параметра вида in out или out проверяется принадлежность значения формального параметра подтипу фактического параметра. В случае преобразования типа значение формального параметра преобразуется обратно и проверяется результат преобразования.

В каждом из вышеуказанных случаев выполнение программы ошибочно, если проверяемое значение неопределено.

Для параметров других типов всех видов проверка осуществляется до вызова, как для скалярных и ссылочных типов; после возврата никаких проверок не делается.

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

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

Если это обозначение типа задает неограниченный индексируемый тип, то формальный параметр ограничен границами соответствующего фактического параметра и никакой проверки не требуется (ни до вызова, ни после возврата, см. 1). Аналогично не требуется никакой проверки, если обозначение типа обозначает неограниченный тип с дискриминантами, так как формальный параметр ограничен точно так же, как соответствующий фактический параметр (см. 1).

Ссылки: вид 6.1, вызов подпрограммы 6.4, выражение 4.4, вычисление 4.5, вычисление имени 4.1, граница массива 3.6, дискриминант 1, имя 4.1, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, неограниченный индексируемый тип 3.6, неограниченный тип с дискриминантами 1, неопределенное значение 1, обозначение типа 2, ограничение 3.3, ограниченный подтип 3.3, ошибочный 1.6, переменная 1, пбдтип 3.3, преобразование типа 4.6, согласованный 1, сопоставление параметров 6.4, тип 3.3, фактический параметр 6.4, формальный параметр

2. ОПУЩЕННЫЕ ПАРАМЕТРЫ

Если спецификация параметра включает выражение по умолчанию для параметра вида in, то соответствующие вызовы подпрограммы не обязательно содержат сопоставления для такого параметра. Если в вызове сопоставление для таких параметров опускается, то оставшаяся часть вызова, следующая за начальными позиционными сопоставлениями, должна использовать только именованные сопоставления.

Для любого опущенного сопоставления параметров выражение по умолчанию вычисляется до вызова, а значение результата используется как неявный фактический параметр.

Примеры процедур со значениями по умолчанию:

procedure ACTIVATE) PROCESS : in PROCESSNAME; AFTER : in PROCESSNAME := NOPROCESS; WAIT : in DURATION := 0.0; PRIOR : in BOOLEAN := FALSE);procedure PAIR(LEPT, RIGHT : PERSONNAME := new PERSON);

Примеры их вызовов:

ACTIVATE(X); ACTIVATE(X, AFTER => Y); ACTIVATE(X, WAIT => 60.0, PRIOR => TRUE); ACTIVATE(X, Y, 10.0, FALSE);PAIR; PAIR(LEFT => new PERSON, RIGHT => new PERSON);

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

Ссылки: вид 6.1, вызов подпрограммы 6.4, выражение по умолчанию для формального параметра 6.1, вычисление 4.5, именованное сопоставление параметров 6.4, позиционное сопоставление параметров 6.4, спецификация параметра 6.1, фактический параметр