Многомерные массивы в Delphi

В этом видеоуроке я наглядно и продробно обьяснил что такое многомерные массивы (матрицы):

 

Скачайте прямо сейчас бесплатно остальные видеоуроки по Delphi в одном архиве: СКАЧАТЬ БЕСПЛАТНО!

 

В Delphi доступны два способа объявления многомерных массивов:

 

ИмяМассива: array[Диапазон_1, Диапазон_2] of ТипДанных; ИмяМассива: array[Диапазон_1] ofarray[Диапазон_2]  of ТипДанных;

 

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


Листинг 6.6. Простой двухмерный массив 

 

 

Пример, приведенный в листинге 6.6. иллюстрирует оба способа обращения к значению в многомерном массиве:
 
 
ИмяМассива[индекс_1, индекс_2]
ИмяМассива[индекс_1] [индекс_2] 

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

Динамические массивы существенно отличаются от статических:

  • Память для динамических массивов выделяется вручную во время выполнения.
  • Первый индекс динамического массива всегда равен О.
  • Память для динамических массивов всегда резервируется в куче. 

Куча — это область основной памяти, которая ограничена только размером доступной на компьютере виртуальной памяти. Если требуется хранить в массиве очень большой объем данных, следует использовать динамический массив, поскольку размеры статических массивов ограничены размером стека.

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

 

ИмяМассива: array of ТипДанных;

 

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

Листинг 6.7. Создание динамического массива 

 

 

 
Для определения размера динамического массива можно использовать функцию Length, которая принимает только один параметр — имя динамического массива. Она возвращает общее количество элементов динамического массива. Индекс последнего элемента, возвращаемый функцией High, равен Length-1.
  
 
Оба цикла for выполняются одинаковое количество раз, поэтому конкретную форму синтаксиса можете выбирать по своему усмотрению. В целях соблюдения единообразия рекомендуется использовать функции High и Low в циклах, подобных этим, и функцию Length, когда требуется определить количество элементов в динамическом массиве. Обратите внимание, что оба оператора цикла for завершаются символами точки с запятой. Это означает, что эти циклы не выполняют никаких действий. Если в реальном приложении окажется, что цикл не работает должным образом, убедитесь, что за зарезервированным словом do не следует символ точки с запятой. Ниже приведена иллюстрация этой программной ошибки: 
 
 

Delphi позволяет также создавать динамические многомерные массивы. Синтаксис объявления динамического многомерного массива выглядит следующим образом:
ИмяМассива: array of array of ТипДанных;
 

В следующем примере показано, как с помощью динамического многомерного массива можно создать представление шахматной доски. Все фигуры на доске занимают свои начальные позиции.

Листинг 6.8. Работа с динамическим многомерным массивом 
 
 

Delphi автоматически управляет динамическими массивами. Память, зарезервированная под динамический массив, автоматически освобождается по завершении использования массива. Память массива можно освобождать также вручную, передавая имя массива процедуре Finalize. В данном случае процедура Finalize освобождает память, зарезервированную для массива ChessTable.

В функции и процедуры массивы можно передавать в качестве параметров, но нельзя указывать диапазон для параметра-массива. В следующем примере дается объявление процедуры, которое приводит к ошибке компиляции.

 

procedure WriteStrings(Str: array[1..20] of string);

begin
end;

 

Если процедуре нужно передать массив, состоящий из 20 строк, потребуется создать новый тип данных, а затем создать процедуру, которая принимает новый тип данных в качестве параметра. Для создания нового типа данных необходимо использовать зарезервированное слово type. Синтаксис создания нового типа данных показан ниже:

 

 
type
ТНовыйТипДаиных = СуществующийТип;
 

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

 


 

 

Теперь, когда новый тип данных, представляющий массив, создан, его можно успешно передавать в качестве параметра процедуре или функции.

 

 
 

 

С этим решением связан один недостаток: процедура WriteString может принимать только переменную TSmallArray и, следовательно, мы ограничены массивом, состоящим из 20 строк. Если нужно работать с массивами других размеров, необходимо определить параметр типа открытого массива.

Синтаксис параметра открытого массива аналогичен синтаксису объявления динамического массива:

 

procedure ИмяПроцедуры{ИмяМассива: array of ТипДанных);

 

Параметры открытого массива позволяют передавать процедуре или функции массивы различных размеров. При этом можно передавать статические и динамические массивы и массивы нестандартных типов.

Листинг 6.9. Параметры открытого массива

 

 
 
  
Параметры открытого массива позволяют создавать массив непосредственно в вызове процедуры или функции. Этот процесс называют также передачей конструктора открытого массива. Конструктор открытого массива — это последовательность значений или выражений, заключенная в квадратные скобки и разделенная запятыми. Синтаксис использования конструктора открытого массива в вызове процедуры показан ниже:
 
procedure ИмяПроцедуры{[выражеиие_1, выражение_2,  выражение_п);

Для создания массива строк внутри вызова процедуры WriteStrings можно использовать следующую строку кода: 
 
WriteStrings(['Open1,   'Array',   'Constructor1]);

Параметры открытого массива могут оказаться весьма полезными при необходимости создания вспомогательной функции или процедуры, которая может работать с диапазоном значений. Например, если нужно создать функцию, вычисляющей среднее значение параметров, версия функции, которая может принимать массив значений, значительно более удобна, чем те. которые не могут это делать.
Листинг 6.10. Функция с параметром открытого массива
 
 
 
 
dle

Помоги проекту! Расскажи друзьям об этом сайте: