Объявляя статический массив в Delphi, мы указывали его размерность от и до, например [0..3], то есть длина такого массива определена, она конечна и уже не может быть изменена, в этом собственно и заключается статичность массива.
Динамические же массивы в Delphi не имеют фиксированного размера, и их длину — можно изменять во время выполнения программы. В данном случае при их объявлении, мы размер не указываем, а память под них выделяется при помощи функции SetLength.
Давайте рассмотрим на примере, как все это отражается на синтаксисе. Объявим динамический одномерный массив вещественных чисел:
1) в разделе var просто определяем переменную и ее тип:
1 2 |
var a: array of Real; |
2) Для определения размерности, воспользуемся функцией SetLength. Чтобы было понятней, эта функция имеет два параметра. Первый это переменная нашего массива — a, второй — его длина , допустим пусть будет — 5:
1 2 3 4 |
begin // Выделение памяти для пяти элементов массива вещественных чисел от 0 до 4 SetLength(a, 5); end; |
Чтобы при необходимости высвободить из по массива память, достаточно прописать:
a:=nil; — nil в Delphi означает отсутствие значения.
Для непосредственной работы с динамическими массивами, существует ряд функций, это:
- функция Length — определяющая длину массива;
- функция High — возвращающая наибольший индекс массива;
- функция Low — возвращающая наименьший индекс массива;
Продемонстрируем теперь на примере, работу функции lehgth и возможность изменения размера массива. Для этого напишем программу, в которой мы в Edit будем вводить желаемый размер массива, и по нажатию кнопки, label нам покажет, что введенный размер, нашему массиву присвоен.
Для этого:
1) Кидаем на форму компоненты Label, Button и Edit;
2) Свойство Caption у label и Text у Edit1 ставим в 0, a в свойстве Caption у Button запишем фразу: — Задать размер;
3) Создаем обрабочик событий OnClick на кнопке, объявляем наш массив и записываем следующий код:
1 2 3 4 5 6 7 8 |
var a: array of Real; // Объявление переменной динамического массива b: Integer; // Объявление переменных типа Integer begin b:=StrToInt(Edit1.Text); // Загружаем в переменную содержимое Edit1, (Размер массива) SetLength(a,b); // Определяем массиву динамическую переменную и размер - (переменная b) Label1.Caption:=IntToStr(length(a)); // Отображаем в Label1, присвоенный массиву размер end; |
4) Запускаем проект, и убеждаемся, что можем теперь задавать практически любой размер нашему массиву, вводя числа в Edit, и нажимая на кнопку.
Теперь продемонстрируем на примере один из способов задания размера и автоматического заполнения элементов динамических массивов. Напишем программу, в которой в первый Edit, мы будем вводить размер массива, во второй Edit значение его элементов. А по нажатию на кнопку, компонент Мемо — отобразит нам, как размерность массива, так и содержание его элементов.
Для этого:
1) Кидаем на форму 2 компонента Edit, один — Button и один — Memo;
2) В свойстве Text у Edit1 и Edit2 — записываем 0, очищаем свойство Lines компонента Memo, а в свойство Caption у Button запишем слово: — Вычислить;
3) Создаем обработчик событий OnClick на Button, и пишем следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var a: array of Real; // Объявление переменной динамического массива b: Integer; // Объявление переменных типа Integer c: Integer; begin Memo1.Lines.Clear; // Очищаем Memo от предыдущих результатов c:=StrToInt(Edit1.Text); // Загружаем в переменную содержимое Edit1, (Размер массива) SetLength(a,c); // Определяем массиву динамическую переменную и размер - (переменная с) for b:=0 to high(a) do // От нуля до последнего его элемента (функция high) массива, выполнять begin a[b]:=StrtoFloat(Edit2.Text); // Циклом, в каждый элемент массива, от 0 до последнего элемента помещаем содержимое Edit2 Memo1.Lines.Add(FloatToStr(a[b])); // Циклом заполняем в компоненте Memo1 и размер массива и содержание его элементов end; end; |
4) Запускаем проект, вводим в первый Edit предполагаемый размер, а во второй значение для всех элементов, нажимаем на кнопку и любуемся результатом выведенным в Memo;
У многомерных динамических массивов в Delphi, при их описании вначале задается количество строк, затем длина первого измерения, потом второго, третьего, четвертого и т.д. Причем у всех измерений, может быть различная длина. Нумерация начинается с нуля.
В качестве примера рассмотрим двумерный динамический массив (вопросы по остальным решаются по аналогии).
1) Объявляем многомерный динамический массив a:
1 2 |
var a: array of array of Integer; |
2) Вначале — первой записью (SetLength(a, 5)) , указывается количество строк в массиве a , остальными — вида ( SetLength(a[0],3) ) — длина каждой конкретной строки, где a — переменная массива, [0] — номер строки массива 3 — количество элементов, которые могут содержаться в строке (длина строки).
1 2 3 4 5 6 7 8 9 |
begin SetLength(a, 5); // Массив будет состоять из шести строк (0..5) SetLength(a[0],3); // Первая строка содержит четыре элемента SetLength(a[1], 4); // Вторая строка содержит пять элементов SetLength(a[2], 2); // Третья строка - 3 элемента SetLength(a[3], 5); // Четвертая строка - 6 элементов SetLength(a[4], 1); // Пятая - 2 элементa SetLength(a[5], 5); // Шестая - 6 элементов end; |
Если все это представить графически, то получится примерно следующее (см. рисунок ниже):
3) Обращаемся к элементам массива, загружая в них числа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var a: array of array of Integer; begin SetLength(a, 5); // Массив будет состоять из шести строк (0..5) SetLength(a[0], 3); // Первая строка содержит четыре элемента SetLength(a[1], 4); // Вторая строка содержит пять элементов SetLength(a[2], 2); // Третья строка - 3 элемента SetLength(a[3], 5); // Четвертая строка - 6 элементов SetLength(a[4], 1); // Пятая - 2 элементa SetLength(a[5], 5); // Шестая - 6 элементов a[0, 0]:=10; //Первому элементу, первого массива присваиваем значение - 10 a[1, 3]:=28; //Четвертому элементу, второго массива присваиваем значение - 28 a[2, 2]:=100; //Третьему элементу, третьего массива - 100 a[3, 4]:=8; //Пятому элементу, четвертого - 8 // ... // ... end; |
А вот пример создания динамического многомерного массива состоящего из 6 строк, где все они имеют одинаковую длину, например — по 7 элементов.
1 2 3 4 5 6 7 8 |
var a: array of array of Integer; b: Integer; begin SetLength(a, 6); for b:=Low(a) to High(a) do SetLength(a[b], 7); end; |