Справочник по Ada 2005
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) — вызов функции, возвращающий значение доступа, которое обозначает двумерный массив.