Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 7.doc
Скачиваний:
3
Добавлен:
21.11.2019
Размер:
198.14 Кб
Скачать

6.2.6. Динамические массивы

Динамические массивы не имеют фиксированного размера или длины. Память для динамического массива вновь распределяется при добавлении величины в массив или при вызове процедуры SetLength. Динамический массив определяется следующей структурой

array of baseType

Например,

var MyArray: array of Real;

объявляет одномерный динамический массив вещественных. Декларация не распределяет память для MyArray. Для того, чтобы создавать массив в памяти, необходимо вызвать процедуру SetLength.

SetLength(MyArray, 20);

распределяет массив 20 вещественных чисел, пронумерованных от 0 до 19. Индекс динамического массива всегда целый и начинается с 0.

Для освобождения динамического массива необходимо присвоить nil переменной массива. Динамический массив длины 0 имет ссылку nil.

Если X и Y - динамические массивы, то X :=Y распределяет элементы X по длине Y. В отличие от строк и статических массивов, динамический массив не распределяется автоматически при присваивании. Например,

var

A, B: array of Integer;

begin

SetLength(A, 1);

A[0] := 1;

B := A;

B[0] := 2;

end;

- величина A[0] = 2. Если бы A и B были статическими массивами, то A[0] было бы равно 1.

Выход за допустимый диапазон индексов не сообщается во время компиляции.

Когда переменные динамического массива приравнены, то их ссылки не сравниваются. Таким образом, после выполнения кода

var A, B: array of Integer;

begin

SetLength(A, 1); SetLength(B, 1);

A[0] := 2; B[0] := 2;

end;

A <> B, но A[0] = B[0].

Для того, что бы усечь динамический массив, можно использовать функцию Copy. Например, A := Copy(A, 0, 20) оставляет первые 20 элементов A.

Если динамический массив распределен, можно использовать стандартные функции Length, High и Low. Length возвращает количество элементов в массиве, High возвращает самое большое значение индекса массива (равное Length-1) и Low возвращает 0.

Примечание: При объявлении функции и процедур параметр типа массива может быть представлен как массив базового типа без индексов. Например,

function CheckStrings(A: array of string): Boolean;

Это указывает на то, что функция действует на все массивы определенного базового типа, независимо от их размера, их индексации и независимо от их распределения, статического или динамического.

Для того, чтобы объявлять многомерный динамический массив повторно используют конструкцию array of .... Например,

type TMessageGrid = array of array of string;

var Msgs: TMessageGrid;

объявляет двумерный массив строк. Для того, чтобы распределить память для этого массива вызовите SetLength с двумя целыми аргументами. Например, если I и J - целочисленые переменные, то

SetLength(Msgs,I,J);

распределяет I-J массив и Msgs[0,0] обозначает элемент этого массива.

Можно создать не прямоугольный многомерный динамический массив. На первом шаге необходимо вызвать SetLength, передавая параметры для первых n измерений массива. Например,

var Ints: array of array of Integer;

SetLength(Ints,10);

распределяет десять колонок для Ints, но не задает длину столбцов. Позже, можно распределить столбцы поочередно с разными длинами. Например,

SetLength(Ints[2], 5);

делает третий столбец Ints длиной пять.

Следующий пример использует динамический массив для создания треугольной матрицы строк.

var

A : array of array of string;

I, J : Integer;

begin

SetLength(A, 10);

for I := Low(A) to High(A) do

begin

SetLength(A[I], I);

for J := Low(A[I]) to High(A[I]) do

A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';

end;

end;