Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

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

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

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

formal_parameter_selector_name именованной parameter_association должен разрешиться в обозначение parameter_specification вызываемого представления; это формальный параметр ассоциации. Формальный параметр позиционной parameter_association — это параметр с соответствующей позицией в формальной части вызываемого представления.
Фактический параметр — это либо explicit_actual_parameter, заданный в parameter_association для данного формального параметра, либо соответствующее default_expression, если для формального параметра не задана parameter_association. Ожидаемый тип фактического параметра — это тип соответствующего формального параметра.
Если режим — in, фактический параметр интерпретируется как expression; в противном случае фактический параметр интерпретируется только как name, если это возможно.

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

Если режим in out или out, фактический параметр должен быть name, обозначающим переменную.
Если режим out, фактический параметр — это преобразование представления, а тип формального параметра — скалярный тип, тогда
  • ни тип назначения, ни тип операнда не имеют аспекта Default_Value; или
  • и тип назначения, и тип операнда должны иметь аспект Default_Value, и должен существовать тип (кроме корневого числового типа), являющийся предком как типа назначения, так и типа операнда.
Помимо мест, где обычно применяются правила легальности (см. 12.3), эти правила также применяются в частях с ключевым словом private экземпляра обобщенного блока.
Если формальный параметр является явно алиасированным параметром, тип фактического параметра должен быть помеченным или фактический параметр должен быть алиасированным представлением объекта. Кроме того, если подтип формального параметра F не помечен:
  • подтип F должен статически соответствовать номинальному подтипу фактического объекта; или
  • подтип F должен быть не ограничен, дискриминирован в полном представлении и не ограничен в любом частичном представлении.
Помимо мест, где обычно применяются правила легальности (см. 12.3), эти правила также применяются в частях с ключевым словом private экземпляра обобщенного блока.
При вызове функции уровень доступности фактического объекта для каждого явно алиасированного параметра не должен быть статически глубже уровня доступа хозяина вызова (см. 3.10.2).
Два name являются известными как обозначающие один и тот же объект, если:
  • оба name статически обозначают один и тот же автономный объект или параметр; или
  • оба name являются selected_components, их prefixes известны как обозначающие один и тот же объект, и их selector_name обозначают один и тот же компонент; или
  • оба name являются ссылками (явными или неявными) и ссылками на name известны как обозначающие один и тот же объект; или
  • оба name являются indexed_components, их prefixes известны как обозначающие один и тот же объект, и каждая пара соответствующих значений индексов либо обе являются статическими выражениями с одним и тем же статическим значением, либо обе являются names, известными как обозначающие один и тот же объект; или
  • оба name являются slices, их prefixes известны как обозначающие один и тот же объект, и оба slice имеют статически соответствующие ограничения индексов; или
  • один из двух name статически обозначает объявление переименования, чьё переименованное object_name известно как обозначающее тот же объект, что и другой, prefix любой ссылки в переименованном object_name не является переменной, и любое expression в переименованном object_name не содержит ссылок на переменные ни вызовов нестатических функций.
Два name являются известными как ссылающиеся на один и тот же объект, если
  • Два name известны как обозначающие один и тот же объект; или
  • Один из name является selected_component, indexed_component или slice и его prefix известен как ссылающийся на тот же объект, что и другой name; или
  • Один из двух name статически обозначает объявление переименования, чьё переименованное object_name известно как ссылающееся на тот же объект, что и другой name.
Если вызов C имеет два или более параметров режима in out или out, которые являются элементарного типа, то вызов является законным только в том случае, если:
  • Для каждого name N, обозначающего объект элементарного типа, передаваемого в качестве параметра режима in out или out вызову C, нет другого name среди других параметров режима in out или out для C, который известен как обозначающий тот же объект.
Если конструкция C имеет два или более прямых составных элемента, которые являются names или expressions, чья оценка может произойти в произвольном порядке, по крайней мере один из которых содержит вызов функции с параметром in out или out, то конструкция является законной только в том случае, если:
  • Для каждого имени N, передаваемого в качестве параметра режима in out или out некоторому внутреннему вызову функции C2 (исключая саму конструкцию C), нет другого name где-либо внутри прямого компонента конструкции C, кроме содержащего C2, который известен как ссылающийся на тот же объект.
Для целей проверки этого правила:
  • Для массива aggregate, expression связанной с discrete_choice_list, который имеет два или более дискретных выбора, или имеет нестатический диапазон, рассматривается как два или более отдельных случаев expression;
  • Для записи aggregate:
Выражение expression record_component_association рассматривается как происходящее один раз для каждого связанного компонента; и
Выражение default_expression для каждого record_component_association с <>, для которого связанный компонент имеет default_expression, рассматривается как часть aggregate;
  • Для вызова, любое default_expression, вычисленное как часть вызова, рассматривается как часть вызова.

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

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

Ошибочное выполнение

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

Разрешения реализации

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


Spec-Zone.ru

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