Как создать в delphi динамический массив.

Delphi 7. Занятие 1_7.

delphi динамический массив

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

Возникает ситуация, когда приходится лавировать между экономией памяти (а её надо всегда экономить) и желанием сделать массив как можно больше, чтобы гарантированно разместить в нём все данные).

В таком ситуации на помощь приходят динамические массивы. Принцип их применения состоит в следующем.

Задаем первоначальную длину массива. Если в процессе решения задачи массива не хватит, то переопределяем его размер. При этом значения из старого массива переписываются в новую область памяти.

Старя область памяти, занимаемая массивом, освобождается.

Надо помнить, что если массив большой (а он в Delphi может занимать до 2Гб), то на его перезапись требуется достаточно много времени. Если такую операцию выполнять излишне часто, то время на выполнение вычислительного процесса заметно увеличивается.

Объявление динамического массива.

Динамический массив объявляется следующим образом:

одномерный динамический массив:

Type TArr1=array  of  integer;
     TArr2=array  of  string;

Двумерный динамический массив:

TArr3=array  of  array  of  integer;

Инициация одномерного динамического массива.

Конкретная размерность (мощность) массива задаётся с помощью стандартной функции.

В delphi имеется большой набор стандартных функций для решения широкого круга задач.

С двумя из них мы уже познакомились. Это StrToInt() и IntToStr(). Первая преобразуют строку в целый тип данных, а вторая целый тип преобразует в строку.

Теперь воспользуемся стандартной функцией SetLength(), чтобы установить длину массива.

Например, массив длиной 5 элементов определяется так:

Type 
TArr1=array  of  integer;
var vArr1: Tarr1;

SetLength(vArr1,5); (индекс массива будет лежать в пределах от 0 до 4 и сможет быть равным 0, 1, 2, 3, 4)

Уничтожение динамического массива

Чтобы освободить память, занимаемую массивом, нужно использовать ключевое слово nil:

vArr1:=nil;

Инициация двумерного динамического массива

Немного сложнее инициировать двумерный массив.

Пусть надо создать массив размерностью 4 х 6. Порядок инициации будет таким:

Сначала инициируем первый индекс:

Type 
TArr3=array  of array  of  integer;
vArr3:TArr3;
SetLength(vArr3,4);

Затем инициируют второй индекс:

SetLength(vArr3[0],6);
SetLength(vArr3[1],6);
SetLength(vArr3[2],6);
SetLength(vArr3[3],6);

Инициация трёхмерного динамического массива с различной мощностью по измерениям

Отличительной особенностью динамического массива от статического состоит в том, что количество элементов по каждому индексу (измерению) может быть разным (разная мощность по измерению).

Пусть, например, задан трехмерный массив.

type
tarr=array of array of  array of string;
var
varr: tarr;

Тогда в общем виде обращение к элементу (ячейке) массива будет:

vArr[i,j,k]

Будем инициировать массив по следующей схеме (дерево индексов), начиная отсчёт индексов с «0»:

delphi динамический массив

Или в табличном виде:

delphi динамический массив.
Таблица 1

Инициируем массив vArr[i,j,k] по левому индексу i:

setlength(vArr,2); (то есть индекс i может меняться от 0 до 1)

Инициируем массив по индексу j при i=0:

setlength(vArr[0],3);(то есть индекс j может меняться от 0 до 2, принимая значения 0, 1, 2)

и при i=1:

setlength(vArr[1],2);

Как видим, размерности по второму индексу разные!

И, наконец, инициация по третьему индексу k:

i=0: j=0  
setlength(vArr[0,0],4);
i=0: j=1
setlength(vArr[0,1],2);
i=0: j=2
setlength(vArr[0,2],3);
i=1: j=0
setlength(vArr[1,0],3);
i=1: j=1
setlength(vArr[1,1],5);

Далее заполняем элементы массива значениями:

vArr[0,0,0]:='0-0-0';
vArr[0,0,1]:='0-0-1';
vArr[0,0,2]:='0-0-2';
vArr[0,0,3]:='0-0-3';
vArr[0,1,0]:='0-1-0';
vArr[0,1,1]:='0-1-1';
vArr[0,2,0]:='0-2-0';
vArr[0,2,1]:='0-2-1;
vArr[0,2,2]:='0-2-2';
vArr[1,0,0]:='1-0-0';
vArr[1,0,1]:='1-0-1';
vArr[1,1,0]:='1-1-0';
vArr[1,1,1]:='1-1-1';
vArr[1,1,2]:='1-1-2';
vArr[1,1,3]:='1-1-3';
vArr[1,1,4]:='1-1-4';

Попробуйте сами создать программу, в которой создаётся, заполняется и выводится в компонент Tmemo рассмотренный выше массив.

Заполнение компонента TMemo с помощью оператора цикла for и условного оператора if.

Используем следующие соображения.Используем следующие соображения.

Левый индекс i изменяется от 0 до 1.

Индекс j изменяется в зависимости от значения i. При i=0 максимальное значение j=2, при i=1 максимальное значение j=1.

Правый индекс обозначим k. При i=0 и j=0 → максимальное значение k=3, при i=0 и j=1 максимальное значение k=1 и так далее.

Обозначим максимальное значение по индексу j через jj, а по индексу k через kk.

В результате получим следующую таблицу:

delphi динамический массив

Здесь мы ввели в рассмотрение новый оператор — оператор условия, или условный оператор. Этот оператор работает следующим образом.

В круглых скобках записано условие, которое проверяется на истинность.

В первой строке имеем (i=0). Обратите внимание, что при проверке условия двоеточие после переменной не ставится!

Переменная i может принимать различные значения. Но только при i=0 выполнится выражение, стоящее после ключевого слова then. Во всех остальных случаях строка с оператором if пропускается и выполнение программы продолжается со следующего оператора.

После ключевого слова then могут стоять операторные скобки begin … end; Аналогично сказанному выше, записанный в них код или выполняется, или игнорируется в зависимости от того, будет ли выполнено условие.

Таким образом мы формируем предельное значение по индексу j в зависимости от значения i и предельное значение по индексу k в зависимости от сочетания значений i и j.

Заключение.

В этом занятии мы познакомились с многомерными массивами. Рассмотрели принципы их индексации. Заполнили двух и трёхмерные массивы данными. Узнали, что такое динамический массив и заполнили его данными. Отметили, что мощность массива по каждому индексу может быть разной. Привели пример инициализации и заполнения динамического массива данными.

Пример программы

Составим программу, обрабатывающую трёхмерный динамический массив строк, имеющего различные мощности по индексам.

Объявим тип массива:

type
tarr=array of array of  array of string;
var
varr: tarr;

В соответствие с таблицей 1 инициируем массив по левому индексу:

setlength(vArr,2);

По среднему индексу:

setlength(vArr[0],3);
setlength(vArr[1],2);

По правому индексу:

setlength(vArr[0,0],4);
setlength(vArr[0,1],2);
setlength(vArr[0,2],3);
setlength(vArr[1,0],3);
setlength(vArr[1,1],5);

Заполним массив:

vArr[0,0,0]:='0-0-0';
vArr[0,0,1]:='0-0-1';
vArr[0,0,2]:='0-0-2';
vArr[0,0,3]:='0-0-3';
vArr[0,1,0]:='0-1-0';
vArr[0,1,1]:='0-1-1';
vArr[0,2,0]:='0-2-0';
vArr[0,2,1]:='0-2-1;
vArr[0,2,2]:='0-2-2';
vArr[1,0,0]:='1-0-0';
vArr[1,0,1]:='1-0-1';
vArr[1,1,0]:='1-1-0';
vArr[1,1,1]:='1-1-1';
vArr[1,1,2]:='1-1-2';
vArr[1,1,3]:='1-1-3';
vArr[1,1,4]:='1-1-4';

Выведем построчно элементы массива в компонент memo. Для этого организуем три вложенных цикла:

    for i:=0 to 1 do
    begin//i
       if (i=0) then jj:=2;
       if (i=1) then jj:=1;
        for j:=0 to jj do
        begin//j
           if (i=0) and (j=0) then kk:=3;
           if (i=0) and (j=1) then kk:=1;
           if (i=0) and (j=2) then kk:=2;
        if (i=1) and (j=0) then kk:=1;
        if (i=1) and (j=1) then kk:=4;
              for k:=0 to kk do
              begin//k
                    form1.Memo1.Lines.Append(vArr[i,j,k]);
              end;//k
        end;//j

    end;//i

Элементы массива выводятся в компонент memo построчно:

  form1.Memo1.Lines.Append(vArr[i,j,k]);

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

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

Далее используем новый оператор — оператор условия, или условный оператор if.

Он функционирует следующим образом. в скобках записано проверяемое условие. Например (i=0). Значение переменной i вычисляется в цикле for. Если значение i действительно равно «0», то выполняется оператор, стоящий за ключевым словом then. Иначе оператор if пропускается и выполняется следующий оаператор.

Запись (i=0) and (j=0) означает, что для выполнения оператора, стоящего после then, требуется одновременное выполнение и условия (i=0), и условия (j=0). Если оба условия возвращают значение «истина» одновременно, то выполняется стоящее в if выражение.

Постарайтесь разобраться в логике приведённого отрывка кода.

Глоссарий.

  • Двумерный массив.
  • Трёхмерный массив.
  • Многомерный массив.
  • Динамический массив.
  • Стандартная функция SetLength()
  • Ключевое слово nil
  • Применение условного оператора if

Обновлено: 06.01.2021 — 12:51

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *