Как сделать массив delphi

Добавил пользователь Дмитрий К.
Обновлено: 05.10.2024

Массив, как и любая переменная программы, перед использованием должен быть объявлен в разделе объявления переменных.

В общем виде инструкция объявления одномерного массива выглядит следующим образом:

Имя: array [нижний_индекс. .верхний_индекс] of тип

array – зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива;

нижний_индекс и верхний_индекс – целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;

В общем виде инструкция объявления двумерного массива выглядит так:

Имя: array[НижняяГраница1..ВерхняяГраница1, НижняяГраница2..ВерхняяГраница2] of Тип

НижняяГраница1, ВерхняяГраница1, НижпяяГраница2, ВерхняяГраница2 – целые константы, определяющие диапазон изменения индексов и, следовательно, число элементов массива;

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

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

Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указываются имя этого массива и индекс (индексы) элемента, заключенный в квадратные скобки, например, arr1 [3, 35], arr1 [3] [35] или аrr3 [7].

Количество индексных позиций определяется размерностью массива (одномерный, двумерный и т. д.), при этом размерность не ограничивается. В математике аналогом одномерного массива является вектор, а двумерного— матрица. Индексы элементов массива должны принадлежать порядковому типу. Разные индексы одного и того же массива могут иметь различные типы. Чаще всего индекс имеет целочисленный тип.

Различают массивы статические и динамические.

Статический массив

Статический массив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т. е. они известны еще до компиляции программы. Формат описания типа статического массива:

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

По признаку размещения в памяти массивы подразделяются на статические (static) и динамические (dynamic).

Статические массивы. Эти массивы объявляются с помощью такого формата:

array [indexType 1 , . indexType n ] of baseType

Каждый из типов indexType должен быть порядкового типа, диапазон которого не должен превосходить 2 Гбайт.

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

Многомерные массивы являются массивами массивов, вследствие чего описание type TMatrix = array[1..10] of array[1..50] of Real; эквивалентно type TMatrix = array[1..10, 1..50] of Real. Подобным образом, переменная MyMatrix типа TMatrix может индексироваться как MyMatrix[2,45] или MyMatrix[2][45].

Стандартные функции Low и High возвращают для типа массив или переменной­ низшую и высшую границу для первого индекса массива. Функция Length возвращает число элементов массива в первой размерности. Например, для массива array [-5..5] функция Low вернет –5, а Length вернет значение 11.

Одномерный, статический, упакованный массив символов (Char) называется упакованной строкой (packed string). Упакованные строки совместимы с другими строковыми типами и упакованными строками, которые имеют то же число элементов. Тип массива array[0..x] of Char называется массивом символов с отсчетом от нуля (zero-based character array), используется для хранения строк с завершающим нулем и совместим со значениями типа PChar.

Пример для массивов символов:

cArr : array [0..1000] of char;

// cArr:=sAnsi; несовместимость типов

// cArr:=sShort; несовместимость типов

// cArr:=PChar(sAnsi); несовместимость типов

// cArr:=PChar(sShort); недопустимое приведение типа

cArr:='array [0..1000] of char';

// sShort:=cArr; несовместимость типов

Динамические массивы. Эти массивы, впервые введенные в Delphi 4, не имеют фиксированного размера или длины. Память для них перераспределяется с помощью процедуры SetLength. Динамические массивы объявляются с использованием формата array of baseType, например

var MyFlexibleArray: array of Real;

При описании массива память для него не выделяется, но ее можно выделить так: SetLength(MyFlexibleArray, 20). Динамический массив всегда индексируется целочисленным типом и всегда с нуля, так что после приведенного примера первым элементом массива является MyFlexibleArray[0], а последним – MyFlexibleArray[19].

Попросту говоря, динамические массивы являются указателями, которые, подобно указателям на длинные строки PChar, могут индексироваться. Для освобождения памяти, выделенной массиву, просто присвойте его имени значение nil или вызовите процедуру Finalize.

Для динамических массивов нельзя применять операцию разыменования (^) или вызывать процедуры New и Dispose.

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

A, B: array of Integer;

значением элемента массива A[0] будет 2.

Присваивание значения элементу массива, например, MyFlexibleArray[2] := 7, не вызывает перераспределения памяти. Выход индекса за границу массива не контролируется на этапе компиляции программы, как сказано в документации к Delphi 5.0. На практике, по крайней мере в Delphi 6.0, выход индекса за границу массива контролируется на этапе выполнения программы, что весьма ценно.

При сравнении массивов сравниваются указатели, но не их содержимое.

Для усечения динамического массива можно использовать функцию Copy:

Function Copy(Vec; Index, Count: Integer): array;

Например, после выполнения оператора A := Copy(A, 5, 2) массив A будет содержать только два элемента.

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

Замечание. Описание формального параметра подпрограммы также может иметь вид array of baseType. Такие параметры называют открытыми массивами и никакого прямого отношения к динамическим массивам они не имеют.

Многомерные динамические массивы (multidimensional dynamic arrays).Для их объявления итеративно используется конструкция array of . . Например, описание

type TMessageGrid = array of array of string;

var Msgs: TMessageGrid;

вводит двумерный массив строк. Для инициализации такого массива вызывается процедура SetLength с двумя целочисленными параметрами. После этого выражение Msgs[0,0] указывает на первый элемент такого массива.

Можно создавать такие многомерные динамические массивы, которые не являются прямоугольными. Для этого при первом вызове SetLength ей передается число элементов по первой размерности, например:

var Ints: array of array of Integer;

Этот код выделяет память для 10 строк, но не для столбцов. Далее можно выделить для каждой строки любое число столбцов, например, SetLength(Ints[2], 5). Теперь уже можно присваивать значения элементам третьей строки (индекс 2), даже если для столбцов остальных строк память еще не была выделена. Следующий пример иллюстрирует создание треугольной матрицы:

A : array of array of integer;

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

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

A[I,J] := (I+1)*10 + J + 1;

Пример повторного применения процедуры SetLength и использования трехмерного динамического массива:

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

Элементами массива могут быть данные любого типа, включая структурированные. К необходимости применения массивов (прямого или опосредованного) мы приходим всегда, когда требуется связать и использовать ряд однотипных величин. При описания массива используются зарезервированные слова array и of. За словом array в квадратных скобках указывается диапазон или перечислимый(ordinal) тип, определяющий количество элементов массива. После слова of указывается тип элементов, образующих массив. Доступ к каждому элементу массива осуществляется с помощью индекса. Нельзя указывать значение индекса, не входящий в диапазон массива.

Заполнение массивов происходит поэлементно, обычно использую оператор for:

Допускается инициализация не-локальных переменных-массивов:

Другие примеры объявления массивов

Переменные-массивы, имеющие аналогичный, но не идентичный тип, вообще говоря, не являются совместимыми.

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

Если при форме описания массива задан один индекс, массив называется одномерным, если два индекса — двумерным, если n индексов — n-мерным. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный — понятию прямоугольной таблицы (матрицы). Для доступа к элементам n-мерного массива нужно указывать n индексов:

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

Бывают ситуации, когда заранее трудно предположить, какой размер должен быть у массива. Например если необходимо считать файл: если массив будет слишком малым, то файл может не поместиться в нем, а если массив будет слишком большим, то он будет занимать много лишней памяти. Динамические массивы позволяют создавать массивы с заранее неизвестным количеством элементов. Кроме того, в отличие от вышеупомянутых статических массивов, динамические массивы всегда распределены в динамически выделяемых областях памяти("куче"/heap либо виртуальной памяти процесса).

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

Первый параметр функции SetLength - переменная типа "динамический массив", второй - количество элементов. Счет элементов начинается с 0. Другими словами, динамические массивы всегда индексируются с нуля(в отличие от статических, в которых нижняя граница индекса указывается явно). Также возможно создание многомерных динамических массивов.

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

вывод функции будет таким:

Triangular
1
2 3
4 5 6

Узнать длину динамического массива, можно вызовом функции Length(a), где a- переменная-динамический массив. Очевидно, для дин. массивов, тождесвенно равенство:

Динамический массив в Delphi, подобен стандартной строке в том, что это указатель со встроенным подсчетом ссылок. Отличие же состоит в том, что он не обладает COW-семантикой; другими словами, копируя переменную-дин.массив в другую переменную того же типа, вы копируете указатель, но не сами данные, увеличиваете счетчик ссылок на единицу, и получаете псевдоним, а не копию. Модификация массива-источника, таким образом, модифицирует и массив-приемник, и наоборот, так как это один и тот же блок данных в памяти.

Удаление массива из памяти происходит тогда, когда разрешается последняя ссылка на массив: иными словами, когда переменной-дин. массиву присваивают значение nil, либо она выходит из области видимости(в случае локальных переменных), происходит неявное уменьшение счетчика ссылок на 1, и сравнение этого счетчика с 0. Если счетчик ссылок нулевой, то происходит финализация и освобождение памяти. Принудительно освободить занимаемую массивом память можно также посредством установки его длины в 0:

Массив – это структура данных, представляющая собой набор переменных одинакового типа, имеющих общее имя. Массивы удобно использовать для хранения однородной по своей природе информации, например, таблиц и списков.

Массив, как и любая переменная программы, перед использованием должен быть объявлен в разделе объявления переменных. В общем виде инструкция объявления массива выглядит следующим образом:

  • имя – имя массива;
  • array – зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива;
  • нижний_индекс и верхний_индекс – целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;
  • тип – тип элементов массива.

Примеры объявления массивов:

При объявлении массива удобно использовать именованные константы. Именованная константа объявляется в разделе объявления констант, который обычно располагают перед разделом объявления переменных. Начинается раздел объявления констант словом const. В инструкции объявления именованной константы указывают имя константы и ее значение, которое отделяется от имени символом "равно". Например, чтобы объявить именованную константу нв, значение которой равно 10, в раздел const надо записать инструкцию: нв=10. После объявления именованной константы ее можно использовать в программе как обычную числовую или символьную константу. Ниже в качестве примера приведено объявление массива названий команд-участниц чемпионата по футболу, в котором используются именованные константы.

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

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

Где список – разделенные запятыми значения элементов массива. Например:

Локальный массив можно инициализировать только во время работы программы, например, так:

Читайте также: