Spec-Zone.ru › Ada 95
Справочник Ada 95

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

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

Синтаксис

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

Правила разрешения имен

Имя или префикс, заданные в операторе вызова_процедуры, должны указывать на вызываемый элемент, который является процедурой или именем входа, переименованным как (рассматриваемым как) процедура. Имя или префикс, заданные в вызов_функции, должны указывать на вызываемый элемент, который является функцией. При наличии часть_параметров_фактических, префикс может быть неявным разыменованием значения доступа к подпрограмме.
Вызов подпрограммы должен содержать не более одной ассоциации для каждого формального параметра. Каждый формальный параметр без ассоциации должен иметь выражение_по_умолчанию (в профиле отображаемой по имени или префиксу подпрограммы). Это правило является правилом перегрузки (см. 8.6).

Динамические семантика

При выполнении вызова подпрограммы имя или префикс вызова оцениваются, а каждая ассоциация_параметра оценивается (см. 6.4.1). Если используется выражение_по_умолчанию, подразумевается неявная ассоциация_параметра. Эти оценки выполняются в произвольном порядке. Затем выполняется тело подпрограммы subprogram_body. Наконец, если подпрограмма завершается нормально, после ее выхода происходит необходимое присваивание формальных параметров фактическим (см. 6.4.1).
Исключение Program_Error поднимается в точке вызов_функции, если функция завершается нормально без выполнения оператора return_statement.
вызов_функции обозначает константу, как определено в 6.5; номинальный тип константы определяется типом результата функции.

Примеры

Примеры вызовов процедур:
Traverse_Tree; -- см. 6.1
Print_Header(128, Title, True); -- см. 6.1
Switch(From => X, To => Next); -- см. 6.1
Print_Header(128, Header => Title, Center => True); -- см. 6.1
Print_Header(Header => Title, Center => True, Pages => 128); -- см. 6.1
Примеры вызовов функций:
Dot_Product(U, V) -- см. 6.1 и 6.3
Clock -- см. 9.6
F.all -- предполагая, что F имеет тип доступа к подпрограмме -- см. 3.10
Примеры процедур с выражениями по умолчанию:
процедура Activate(Process : входной Process_Name;
After : входной Process_Name := No_Process;
Wait : входной Duration := 0.0;
Prior : входной Boolean := False);
процедура Pair(Left, Right : входной Person_Name := новый Person); -- см. 3.10.1
Примеры их вызовов:
Activate(X);
Activate(X, After => Y);
Activate(X, Wait => 60.0, Prior => True);
Activate(X, Y, 10.0, False);
Pair;
Pair(Left => новый Person, Right => новый Person);
ПРИМЕЧАНИЯ
7 Если выражение по умолчанию используется для двух или более параметров в множественном описании параметра, выражение по умолчанию вычисляется один раз для каждого пропущенного параметра. Следовательно, в приведенных выше примерах оба вызова Pair эквивалентны.

Примеры

Примеры перегруженных подпрограмм:
процедура Put(X : входной Integer);
процедура Put(X : входной String);
процедура Set(Tint : входной Color);
процедура Set(Signal : входной Light);
Примеры их вызовов:
Put(28);
Put("нет возможной неоднозначности здесь");
Set(Tint => Red);
Set(Signal => Red);
Set(Color'(Red));
-- Set(Red) было бы неоднозначным, так как Red может
-- обозначать значение типа Color или типа Light


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API