248
Глава 6. Инкапсуляция
содержимое этого компонента, то есть его r-значение, то по найденному адре (/-значению) получить это значение не составляет труда.
Другие операции над векторами включают их создание и уничтожение, пр своение значения компонентам вектора и арифметические операции над пара» векторов одинаковой размерности, например их сложение (при этом складываю ся значения соответствующих компонентов). Поскольку векторы имеют разме ность, вставка и удаление компонентов не допускаются; может меняться толы значение компонента. В большинстве языков имеется довольно ограниченный н бор операций с векторами, но APL содержит большое количество операций, позв ляющих, в частности, осуществлять декомпозицию вектора на компоненты и о здавать новые векторы различными способами.
Реализация. Однородность компонентов и фиксированная размерность ва торов упрощают их хранение и доступ к отдельным компонентам. Однородное: означает, что размер и структура каждого компонента одинаковые, а размерное! вектора подразумевает инвариантность количества компонентов и их местополс жения в течение всего времени его жизни. Подходящим способом реализации т; кой структуры является последовательное представление компонентов в памян как показано на рис. 6.3. В эту структуру также может быть включен дескрипщ описывающий некоторые или все атрибуты вектора, особенно в том случае, есл они окончательно определяются только во время выполнения программы. Верх нюю и нижнюю границы диапазона значений индексов (которые не требуются дл: доступа к компонентам) обычно сохраняют в дескрипторе на случай, если потре буется проверка соответствия индекса объявленному диапазону. Другие атрибу ты обычно не хранятся в дескрипторе во время выполнения программы; они нуж ны только во время компиляции для контроля типов и определения способ представления вектора в памяти.
Если начинать с первого компонента вектора, то для доступа к 1-му компонен ту следует пропустить I - 1 компонентов. Если размер каждого компонента Е, ti следует пропустить (I - 1) х Е минимально адресуемых областей памяти (ячеек) Если LB — нижняя граница диапазона индексов, то количество пропускаемых ком понентов будет I - 1_Вили(1 - LB) х Е ячеек памяти. Если первый компонент век тора начинается с ячейки с адресом ос, то для /-значения компонента вектора полу чается следующая формула доступа:
l-значение(А[I]) = а + (I - LB) х Е
Это можно переписать как
l-значение(А[I]) - (се - LB х Е) + (I х Е)
Обратите внимание на то, что когда для вектора выделено место в памяти, выражение (а - LB х Е) становится постоянной величиной (обозначим ее К) и формула доступа упрощается:
7-значение(А[I]) = К + I х Е
Для языков типа FORTRAN величина К является постоянной и может быть вычислена во время компиляции. Это обеспечивает достаточно быстрый доступ к компонентам вектора. Даже в языках типа Pascal, где каждый аргумент К может быть переменным, К нужно вычислить только один раз, когда вектору отводится определенное место в памяти. Следовательно, доступ к элементам массива эффек-
6.1. Структурированные типы данных
249
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.