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

6.4.1 Ассоциации параметров

Ассоциация параметра определяет связь между фактическим параметром и формальным параметром.

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

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

Правила легитимности

Если режим вход-выход или выходной, фактический параметр должен быть имя, обозначающее переменную.
Если режим выходной, фактический параметр — это преобразование представления, а тип формального параметра — тип доступа или скалярный тип, для которого указан аспект Default_Value, то
  • должен существовать тип (кроме корневого числового типа), который является предком как целевого типа, так и типа операнда;
  • в случае скалярного типа тип операнда преобразования должен иметь указанный аспект Default_Value.
Помимо мест, где обычно применяются правила легитимности (см. 12.3), эти правила также применяются в частях раздела «private» экземпляра генерируемого блока.
Если формальный параметр — явно алиасированный параметр, тип фактического параметра должен быть помеченным или фактический параметр должен быть алиасированным представлением объекта. Кроме того, если подтип формального параметра F не помечен:
  • подтип F должен статически совпадать с номинальным подтипом фактического объекта;
  • подтип F должен быть не ограниченным, дискриминированным в полном представлении и не ограниченным в любом частичном представлении.
Помимо мест, где обычно применяются правила легитимности (см. 12.3), эти правила также применяются в частях раздела «private» экземпляра генерируемого блока.
При вызове функции уровень доступности фактического объекта для каждого явно алиасированного параметра не должен быть статически глубже, чем уровень доступности мастера вызова (см. 3.10.2).
Два имени считаются обозначающими один и тот же объект, если:
  • оба имени статически обозначают тот же самостоятельный объект или параметр;
  • оба имени являются выбранным_компонентом, их префиксы обозначают один и тот же объект, а их имена_селекторов обозначают тот же компонент; или
  • оба имени — это разыменования (явные или неявные), и разыменованные имени обозначают один и тот же объект; или
  • оба имени — это индексированные_компоненты, их префиксы обозначают один и тот же объект, и каждая пара соответствующих значений индексов либо являются обоими статическими выражениями с тем же статическим значением, либо обоими имени, обозначающими один и тот же объект; или
  • оба имени — это срезы, их префиксы обозначают один и тот же объект, а два срезы имеют статически совпадающие ограничения индексов; или
  • одно из двух имени статически обозначает объявление переименования, переименованное имя_объекта_имя которого известно как обозначающее тот же объект, что и другое, префикс любого разыменования внутри переименованного имя_объекта_имя не является переменной, и любое выражение внутри переименованного имя_объекта_имя не содержит ссылок на переменные или вызовов нестатических функций.
Два имени считаются ссылками на один и тот же объект, если:
  • Два имени обозначают один и тот же объект;
  • Одно из имени — выбранный_компонента, индексированный_компонента или срез, и его префикс ссылается на тот же объект, что и другое имя; или
  • Одно из двух имени статически обозначает объявление переименования, переименованное имя_объекта_имя которого ссылается на тот же объект, что и другое имя.
Если у вызова C есть два или более параметров с режимом вход-выход или выходной, которые являются элементарными типами, то вызов допустим только в том случае, если:
  • Для каждого имени N, которое передается как параметр режима вход-выход или выходной вызову C, нет другого имени среди других параметров режима вход-выход или выходной для C, обозначающего один и тот же объект.
Если у конструкции C есть две или более прямых составляющих, которые являются имя или выражение, чье вычисление может происходить в произвольном порядке, по крайней мере одно из которых содержит вызов функции с параметром вход-выход или выходной, то конструкция допустима только в том случае, если:
  • Для каждого имени N, которое передается как параметр режима вход-выход или выходной некоторому внутреннему вызову функции C2 (не включая саму конструкцию C), нет другого имени где-либо внутри прямой составляющей конструкции C, отличной от той, которая содержит C2, которое ссылается на тот же объект.
Для целей проверки этого правила:
  • Для массива агрегата, выражения, связанного с списком_дискретных_выборов, который имеет два или более дискретных выбора или имеет нестатический диапазон, рассматривается как два или более отдельных вхождения выражения;
  • Для записи агрегата:
Выражение выражения ассоциации_компонента_записи считается вхождением для каждого ассоциированного компонента; и
Выражение_по_умолчанию выражения для каждой ассоциации_компонента_записи с <>, для которого ассоциированный компонент имеет выражение_по_умолчанию, считается частью агрегата;
  • Для вызова любое выражение_по_умолчанию выражения, вычисленное как часть вызова, считается частью вызова.

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

Для вычисления ассоциации_параметра:
  • Сначала оценивается фактический параметр.
  • Для параметра доступа access_definition уточняется, что создаёт анонимный тип доступа.
  • Для параметра (любого режима), передаваемого по ссылке (см. 6.2), оценивается преобразование вида фактического параметра к номинальному подтипу формального параметра, и формальный параметр обозначает это преобразование.
  • Для параметра in или in out, передаваемого по значению (см. 6.2), создаётся объект формального параметра, и значение фактического параметра преобразуется в номинальный подтип формального параметра и присваивается формальному.
  • Для параметра out, передаваемого по значению, создаётся объект формального параметра, и:
Для типа доступа формальный параметр инициализируется из значения фактического, без проверки соответствия значения ограничениям, предикатам или исключения нулевого значения;
Для скалярного типа, для которого задан аспект Default_Value, формальный параметр инициализируется из значения фактического, без проверки соответствия значения ограничениям или предикатам. Кроме того, если фактический параметр является преобразованием вида и либо
не существует типа (кроме корневого числового типа), являющегося предком как целевого типа, так и типа операнда преобразования; или
аспект Default_Value не указан для типа операнда преобразования
то поднимается Program_Error;
Для составного типа с дискриминантами или имеющего неявные начальные значения для любых подкомпонентов (см. 3.3.1), поведение такое же, как для параметра in out, передаваемого по значению.
Для любого другого типа формальный параметр не инициализирован. Если составной, оценивается преобразование вида фактического параметра к номинальному подтипу формального (что может вызвать Constraint_Error), и фактический подтип формального — это подтип преобразования вида. Если элементарный, фактический подтип формального определяется его номинальным подтипом.
  • При вызове функции для каждого явно алиасированного параметра проверяется, что уровень доступности мастера фактического объекта не глубже, чем уровень доступности мастера вызова (см. 3.10.2).
Формальный параметр режима in out или out с дискриминантами ограничен, если либо его номинальный подтип, либо фактический параметр ограничены.
После нормального завершения и выхода из подпрограммы для каждого параметра in out или out, передаваемого по значению, значение формального параметра преобразуется к подтипу переменной, заданной как фактический параметр, и присваивается ей. Эти преобразования и присваивания происходят в произвольном порядке.

Ошибка выполнения

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


Spec-Zone.ru

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