Program UsingArrays; Type
MyArray2D = Array [1..10, 5..150] Of Integer;
{Описание двухмерного массива) Var
Array2D: MyArray2D;{Описание переменной-массива} Begin
Array2D [1, 6]:= 18;{Присвоение значение элементу
массива с индексами 1, 6} End.
Обратите внимание, что максимально возможный размер массивов в Delphi увеличен по сравнению с Pascal, и может достигать 2 гигабайт вместо 64 килобайт.
Заметим, что для массивов одного и того же типа, как и для записей, определена операция присвоения, выполняемая копированием значений элементов одного массива в другой. Также доступна операция присвоения для отдельных элементов массивов. Сравнение массивов в целом невозможно и вызывает ошибку компиляции. Однако это доступно динамическим массивам, описанным ниже.
Переменную-массив можно описать и без предварительного создания соответствующего типа данных, прямо в разделе описания переменных:
Var
MyArray2D: Array [1..10, 5..150] Of Integer;
{Описание переменной — двухмерного массива целочисленных элементов;
Необходимо отметить, что при внешне эквивалентном описании два массива не будут считаться принадлежащими к одному типу данных, если это не указано явно:
?•::ходит по
Туре
ArrType = Array [1..10] Of Integer;
{Описание типа данных — массива целочисленных элементов}
Var А1
= Array [1..10] Of Integer;
{Описание переменной-массива целочисленных элементов}
А2 = Array [1..10] Of Integer;
A3: ArrType;
A4: ArrType; Begin
A3:= A4;
Al:= A2;
{Описание переменной-массива целочисленных элементов, полностью идентичной А1}
{Описание переменной-массива целочисленных элементов}
{Операция допустима, так как обе переменные имеют один и тот же тип — ArrType}
{Операция не допустима, так как обе переменные имеют не один и тот же тип данных, а лишь похожие по структуре типы}
В рассмотренном примере все четыре используемые переменные являются одномерными массивами целочисленных элементов, проиндексированных от 1 до Ю, однако переменные A3 и А4 совместимы между собой, так как при их описании явно указан один и тот же тип, а переменные А1 и А2 не совместимы ни между собой, ни с переменными A3 и А4. Соответственно при попытке компиляции такого фрагмента программы будет выдана ошибка "Incompatible types» - "Несовместимость типов».
Однако если бы переменные А1 и А2 были описаны в одной строке, то их типы считались бы идентичными:
var
Al, A2
Array [1..10] Of Integer;
{Описание двух переменных-массивов целочисленных элементов}
Begin
Al := А2;
(Операция допустима)
Динамические структуры данных
Для работы с динамическими структурами данных Turbo Pascal предлагал два вида ссылочных типов — типизированные указатели и нетипизи-рованные.
Нетипизированный указатель представляет собой переменную, в которой хранится адрес некоторой области памяти некоторого размера, и предназначен для хранения произвольных данных. Типизированные ссылки указывают на место в памяти, где хранятся данные определенного типа.
В Delphi сохранены все возможности работы с указателями, а также добавлены новые структуры данных на их основе.
2.4.1. Нетипизированные указатели
Переменные -- нетипизированные указатели описываются с указанием типа Pointer, а выделение и освобождение памяти под них осуществляется, соответсвенно, командами GetMem и FreeMem (см. листинг 2.6).
Листинг 2.6. Использование нетипизированных переменных-указателей
Program UsingPointers; Var
Point: Pointer;
Begin
GetMem(Point, 1024) ;
FreeMem(Point, 1024)
{Описание переменной-указателя, указан тип Pointer, то есть описывается нетипизированная ссылка!
{Выделение памяти под переменную-указатель размером 1024 байт} {Освобождение памяти, занятой под переменную-указатель}
End.
2.4.2. Типизированные указатели
Использование нетипизированных указателей ограничено стандартными функциями, принимающими такие переменные в качестве параметров, а также низкоуровневым программированием. Более интересными для рассмотрения являются типизированные указатели.
Для описания типизированной ссылки не предусмотрен какой-либо специальный тип данных, в отличие от нетипизированных указателей, имеющих тип Pointer. Поскольку ссылочная переменная такого рода всегда указывает на данные конкретного типа, то ее описание и строится на основе этого типа. Для указания на ссылочную природу переменных используется оператор «^», и описание выглядит следующим образом:
Var
<Переменная>:
^<названке типа>;
Или в разделе описания типов данных:
Туре
<Новый тип данных> = Л<Тип данных>;
После описания переменной-указателя под нее выделяется память только для хранения адреса, а под сами данные, на которые переменная указывает, память не выделяется. Для инициализации переменной используется процедура New, отличием которой от аналогичной процедуры GetMem, используемой для работы с нетипизированными указателями, является отсутствие второго параметра, определяющего размер выделяемой памяти. Это связано с тем, что типизированная ссылка указывает на данные известного типа, соответственно, размер эт^их данных также известен компилятору.
Итак, инициализация переменной выглядит следующим образом:
New(<Типизированный указатель>);
Соответственно, при освобождении памяти, занятой под типизированный
указатель, используется процедура Dispose — аналог процедуры FreeMem без второго параметра:
Dispose(<Типизированный указатель>);
Обращение к переменной-указателю происходит обычным образом — по ее имени, а для обращения к данным, на которые переменная указывает, после имени переменной указывается оператор разыменовывания «л»:
<Название переменной>А
Рассмотрим пример работы с типизированной ссылкой, указывающей на переменную типа Double (см. листинг 2.7).
Begin
New(MyPDouble);
{Выде.-.е.-.-.^ переуе:-н;'.-: опреде~ =-■; ~ памятх з z .-
MyPDoubleA= 12.{Приев: е-" ссылает ; -.
Dispose(MyPDoubi
End.
котору:-: освобож
MyPDoub
2.4.3.
В Delphi добавлена ин зания размерностей и.
Var
IntArray: Array
Такие массивы являю длину. Установка разм ния программы произ ций SetLengthи Lencмеруются от нуля.
Program UsingDyna Var
А, В: Array of