Справочное руководство по Ada 2012
4.1.1 Индексированные компоненты
Индексированный компонент обозначает либо компонент массива, либо элемент семейства элементов.
Синтаксис
Правила разрешения имён
Префикс индексированного компонента с заданным количеством выражений должен указывать на массив (после любого неявного разыменования) с соответствующим количеством индексов или на семейство элементов задачи или защищенного объекта (в этом случае должно быть только одно выражение).
Ожидаемый тип каждого выражения — соответствующий тип индекса.
Статическая семантика
Когда префикс обозначает массив, индексированный компонент обозначает компонент массива со значением указанного индекса (индексов). Номинальный подтип индексированного компонента — подтип компонента типа массива.
Когда префикс обозначает семейство элементов, индексированный компонент обозначает отдельный элемент семейства элементов со значением указанного индекса.
Динамическая семантика
Для вычисления индексированного компонента префикс и выражения вычисляются в произвольном порядке. Значение каждого выражения преобразуется в соответствующий тип индекса. Проверяется, принадлежит ли каждое значение индекса соответствующему диапазону индексов массива или семейства элементов, обозначаемых префиксом. Если проверка завершается неудачно, генерируется исключение Constraint_Error.
Примеры
Примеры индексированных компонентов:
My_Schedule(Sat) -- компонент одномерного массива (см. 3.6.1)
Page(10) -- компонент одномерного массива (см. 3.6)
Board(M, J + 1) -- компонент двумерного массива (см. 3.6.1)
Page(10)(20) -- компонент компонента (см. 3.6)
Request(Medium) -- элемент семейства элементов (см. 9.1)
Next_Frame(L)(M, N) -- компонент вызова функции (см. 6.1)
Page(10) -- компонент одномерного массива (см. 3.6)
Board(M, J + 1) -- компонент двумерного массива (см. 3.6.1)
Page(10)(20) -- компонент компонента (см. 3.6)
Request(Medium) -- элемент семейства элементов (см. 9.1)
Next_Frame(L)(M, N) -- компонент вызова функции (см. 6.1)
ПРИМЕЧАНИЯ
1 Примечания к примерам: Для компонентов многомерных массивов (таких как Board) и массивов массивов (таких как Page) используются разные обозначения. Компоненты массива массивов являются массивами и, следовательно, могут быть индексированы. Таким образом, Page(10)(20) обозначает 20-й компонент Page(10). В последнем примере Next_Frame(L) — это вызов функции, возвращающий значение доступа, которое обозначает двумерный массив.