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

Наши рекомендации