Инкапсуляция. Векторы и массивы, страница 6

Предположим, у нас имеется массив А[Ц : 1Л Ln : L)n] размерности п, где

U — нижние границы, Ui — верхние границы г'-го измерения, а е — размер каждого элемента массива. Предположим, что начало массива расположено по адресу а.

+ Вычисление множителей. Каждый множитель т, вычисляется следующим образом:

nin = е


Множители т, и виртуальный начальный адрес VO могут храниться в дескрипторе массива во время выполнения программы.


Для каждого 1 отп - 1 до 1 вычисляем т, = (Uw - 1_м + 1)х тм. + Вычисление виртуального начального адреса:


255

6.1. Структурированные типы данных

+ Адрес элемента массива. Адрес элемента A[Si.... sn] определяется по следую щей формуле:




Сечения

Спецификация. Сечение — это подструктура массива, которая сама является массивом. На рис. 6.6 приведены некоторые примеры сечений: на рис. 6.6, а представлено сечение в виде второго столбца матрицы, состоящей из трех столбцов; на рис. 6.6, б сечение представлено третьей строкой матрицы, состоящей из четырех строк, а на рис. 6.6, в сечением является третья плоскость трехмерного массива.




Рис. 6.6. Сечения массивов: а — одномерное сечение (столбец); б — одномерное сечение (строка); вмногомерное сечение (плоскость)

Одним из первых языков, в которых были реализованы сечения, является PL/I. Если массив объявлен как А(4, 3), то сечение, изображенное на рис. 6.6, а, обозначается через А(*. 2), где символ * означает, что первый индекс (строка) меняется от 1 до 4. Аналогично два других сечения этого рисунка можно задать как 8(3. *)иС(3, *, *). Сечения можно передавать подпрограммам в качестве аргументов.

В языке FORTRAN в подпрограммы разрешается передавать часть массива в качестве параметров. Поскольку в FORTRAN используется развертывание массивов по столбцам, то при передаче элемента А(1, 3) векторному параметру В устанавливается соответствие между А(1, 3)иВ(1),А(2, 3)иВ(2),А(3, 3)иВ(3)ит.д. Это позволяет программистам разрабатывать эффективные матричные алгоритмы обработки большой матрицы по частям. Однако для того, чтобы воспользоваться этими алгоритмами, требуется знание внутренних механизмов представления матриц в языке FORTRAN.

Поскольку этот метод противоречит современной концепции разработки языка, в FORTRAN 90 реализовано понятие сечений. Сечения, изображенные на рис. 6.6, в FORTRAN 90 задаются как А(1 : 4,2), 6(3,1 :3)иС(3.1 : 3.1 : 4).

Реализация. Использование дескрипторов позволяет эффективно реализовать сечение. Например, матрица А размером 3x4 описывается дескриптором.


256

Глава 6. Инкапсуляция

VO

а - 4

LB 1

1

UB 1

4

Множитель 1

3

LB 2

1

UB 2

3

Множитель 2

1

В этом случае формула вычисления адреса элемента А[ I, J ], приведенная в конце предыдущего раздела, будет выглядеть следующим образом:

7-значение(А[1. J]) = VO + I х 3 + J x 1

Обратите внимание на то, что в этом случае множитель 2, который представляет собой размер объекта данных, также определяет расстояние между последовательными элементами массива. В данном случае элементы массива следуют непрерывно один за другим. Однако это не обязательно; сечение обладает таким свойством, что все его элементы расположены на одинаковом расстоянии друг от друга, но при размещении массива в памяти они не следуют непрерывно друг за другом. Следовательно, дескриптор сечения А(*. 2) (см. рис. 6.6), учитывая дескриптор всего массива А, можно записать следующим образом.



VO


а - 2




LB 1 UB 1 Множитель 1


1

4 3