Статические (стандартные) массивы
5.2.1 Вектор
Объявление вектора или одномерного массива имеет следующий общий вид (здесь и в дальнейшем используем рекомендацию, в соответствии с которой структурированный пользовательский тип объявляется отдельно от объявления переменной этого типа):
Type
<имя типа> = Array[<ограниченный тип>] Of <тип элементов>;
Var <имя массива> : <имя типа>;
Например:
Type
TarrVect = Array[-2..10] Of Integer;
TarrStudent = Array[0..100] Of TStudent;
TStroka = Array[0..10]OfChar;
Var A, B: TarrVect;
arrStudent: TarrStudent;
S: TStroka;
Здесь объявлены два одинаковых массива A и B, все элементы которого имеют тип Integer, и один массив arrStudent, с базовым типом TarrStudent, объявленным в подразделе 5.2. Количество элементов в каждом массиве A и B равно 13, массив arrStudent содержит 101 элемент. Массив символов S - это фактически строка, с ним можно обращаться как со строкой.
В рассмотренных примерах индексы были заданы ограниченным целым типом. Так чаще всего и бывает, но это не обязательно. Для индексации массива могут использоваться любые ограниченные или перечислимые типы. Можно определить массив arrColor следующим образом:
Type
Color = (Red, Green, Blue);
Var arrColor: Array [Color] Of Real;
Теперь можно обратиться, например, ко второму элементу вектора arrColor как arrColor[Green].
Не запрещается задавать индекс символами.
Физическая структура вектора представляется в машинной памяти последовательностью одинаковых по длине участков памяти (слотов), каждый из которых предназначен для хранения одного элемента вектора. Обычно элементы вектора располагаются в памяти в порядке возрастания адресов соответствующих им слотов. Дескриптор вектора может содержать такие поля, как имя вектора, адрес в памяти его начального элемента (т. е. первого слота), нижняя и верхняя границы индекса, тип элемента и размер слота. Физическая структура вектора A, объявленного выше, показана на рисунке 5.1.
Рисунок 5.1 - Пример физической структуры вектора с базовым типом Integer
При доступек любому элементуимя вектора и текущий индекс элемента преобразуются в физический адрес слота, в котором располагается этот элемент. Как видно из рисунка5.1, логическая и физическая структуры вектора совпадают, и то и другое - линейные последовательности элементов. Если в логической структуре при переходе от одного элемента к другому последовательному элементу индекс изменяется на единицу, то при переходе между последовательными элементами в физической структуре, адрес изменяется на величину, равную размеру слота базового типа.
5.2.2 Многомерные статические массивы
Как было отмечено выше, вектор - это одномерный массив. Во всех языках программирования можно объявлять и многомерные массивы, т. е. массивы, элементами которых являются массивы. Например, двумерный массив можно объявить следующим образом:
Type TarrMatr = Array[0..5]Of Array[0..3] Of Word;
Var X: TarrMatr;
То же самое можно объявить более компактно:
Type TarrMatr = Array[0..5, 0..3] Of Word;
Var X: TarrMatr;
Доступ к значениям элементов многомерного массива обеспечивается с помощью имени переменной типа «массив» и индексов, перечисляемых через запятую, например, X[3, 0]. Количество указываемых индексов должно быть равно размерности массива: для доступа к элементу М-мерного массива необходимо указать М индексов.
Все элементы массива имеют один и тот же тип. В отличие от вектора для массива общего вида преобразование логической структуры в физическую имеет более сложный вид. Это преобразование выполняется путем линеаризации, в ходе которой М-мерная логическая структура массива преобразуется в одномерную физическую структуру, представляющую собой линейно упорядоченную последовательность слотов. Такое преобразование реализуется с помощью подходящей функции упорядочения, аргументом которой является упорядоченный набор индексов элемента, а значением - адрес соответствующего слота. Например, если последовательность однотипных элементов трактуется как двумерный массив, и нижние границы индексов i и j равны 0, то адрес (i, j)-элемента матрицы вычисляется с помощью следующей функции упорядочения:
Адрес(i, j) = база + Nrow * SizeOf(Element) * i + j,
где база - адрес начального элемента массива,
Nrow - количество элементов в строке,
SizeOf(Element) - размер слота элемента в байтах,
Хотя физическая структура М-мерного массива при линейном упорядочении его элементов в памяти совпадает с физической структурой вектора, дескриптор массива отличается от дескриптора вектора. В частности, в полях дескриптора массива может содержаться следующая информация:
- поле типа структуры;
- поле имени массива, например, Matr;
- поле, содержащее размерность массива;
- адрес массива в памяти (база);
- поля, содержащие пары граничных значений индексов, число этих полей равно размерности массива;
- поля, содержащие специальные индексные множители (их число равно размерности массива), необходимые для использования в функции упорядочения;
- поле базового типа массива;
- поле, содержащее размер слота для элемента.
Для массивов в Delphi определена операция присваивания. Если два массива A и B типа TarrVect определены, с помощью нотаций, приведенных в п. 5.2.1, то в результате выполнения оператора
A:= B;
значения элементов массива В скопируются в элементы массива А.
Но если объявить массивы как
Var A: Array[-2..10] Of Integer;
B: Array[-2..10] Of Integer;
то при попытке присваивания A:= B компилятор Delphi выдаст сообщение об ошибке несовместимости типов. Дело в том, что компилятор считает, что переменные имеют один и тот же тип только в случае, если они объявлены в одном и том же списке или они явно определены через некоторый поименованный тип. Это еще один аргумент в пользу использования имен типов в описаниях структурированных переменных.
5.2.3 Свойства статических массивов
Статические массивы характеризуются следующими свойствами:
- постоянство структуры в течение всего времени ее существования,
- смежность элементов и непрерывность области памяти, отводимой сразу для всех элементов структуры.
- простота и постоянство отношений между элементами структуры, позволяющие исключить информацию об этих отношениях из области памяти, выделенной для элементов структуры, и хранить ее в компактной форме в дескрипторах.
Дата добавления: 2015-08-21; просмотров: 765;