Динамические массивы в Delphi

Объявляя статический массив в Delphi, мы указывали его размерность от и до, например [0..3], то есть длина такого массива определена, она конечна и уже не может быть изменена, в этом собственно и заключается статичность массива.

Динамические же массивы в Delphi не имеют фиксированного размера, и их длину — можно изменять во время выполнения программы. В данном случае при их объявлении, мы размер не указываем, а память под них выделяется при помощи функции SetLength.

Давайте рассмотрим на примере, как все это отражается на синтаксисе. Объявим динамический одномерный массив вещественных чисел:

1) в разделе var просто определяем переменную и ее тип:

2) Для определения размерности, воспользуемся функцией  SetLength. Чтобы было понятней, эта функция имеет два параметра. Первый это переменная нашего массива — a, второй — его длина , допустим пусть будет — 5:

Чтобы при необходимости высвободить из по массива память, достаточно прописать:

a:=nil; — nil в Delphi означает отсутствие значения.

Для непосредственной работы с динамическими массивами, существует ряд функций, это:

  • функция Length — определяющая длину массива;
  • функция High — возвращающая наибольший индекс массива;
  • функция Low —  возвращающая наименьший индекс массива;

Продемонстрируем теперь на примере, работу функции lehgth и возможность изменения размера массива. Для этого напишем программу, в которой мы в Edit будем вводить желаемый размер массива, и по нажатию кнопки, label нам покажет, что введенный размер, нашему массиву присвоен.

Для этого:

1) Кидаем на форму компоненты LabelButton и Edit;

2) Свойство Caption у label и Text у Edit1 ставим в 0, a в свойстве Caption у Button запишем фразу: — Задать размер;

3) Создаем обрабочик событий OnClick на кнопке, объявляем наш массив и записываем следующий код:

4) Запускаем проект, и убеждаемся, что можем теперь задавать практически любой размер нашему массиву, вводя числа в Edit, и нажимая на кнопку.

Теперь продемонстрируем на примере один из способов задания размера и автоматического заполнения элементов динамических массивов. Напишем программу, в которой в первый Edit, мы будем вводить размер массива, во второй Edit значение его элементов. А по нажатию на кнопку, компонент Мемо — отобразит нам, как размерность массива, так и содержание его элементов.

Для этого:

1) Кидаем на форму 2 компонента Edit, один — Button и один — Memo;

2) В свойстве Text у Edit1 и  Edit2 — записываем 0, очищаем свойство Lines компонента Memo, а в свойство Caption у Button запишем слово: — Вычислить;

3) Создаем обработчик событий OnClick на Button, и пишем следующее:

4) Запускаем проект, вводим в первый Edit предполагаемый размер, а во второй значение для всех элементов, нажимаем на кнопку и любуемся результатом выведенным в Memo;

 

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

В качестве примера рассмотрим двумерный динамический массив (вопросы по остальным решаются по аналогии).

1) Объявляем многомерный динамический массив a:

2) Вначале — первой записью (SetLength(a, 5)) , указывается количество строк в массиве a , остальными — вида ( SetLength(a[0],3) ) — длина каждой конкретной строки, где a — переменная массива, [0] — номер строки массива 3 — количество элементов, которые могут содержаться в строке (длина строки).

Если все это представить графически, то получится примерно следующее (см. рисунок ниже):

-в-Delphi-1 Динамические массивы в Delphi

3) Обращаемся к элементам массива, загружая в них числа:

А вот пример создания динамического многомерного массива состоящего из 6 строк, где все они имеют одинаковую длину, например — по 7 элементов.