АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Динамические массивы

Читайте также:
  1. Динамические массивы
  2. Динамические параметры
  3. Массивы
  4. Массивы
  5. Механические, аэродинамические, электромагнитные.
  6. Многомерные символьные массивы
  7. Открытые массивы
  8. ТЕРМОДИНАМИЧЕСКИЕ СВОЙСТВА ВОДЫ
  9. Указатели и массивы
  10. Указатели и массивы

Типы данных

Структурированные типы

В Delphi 4 структурированных типа: массивы, записи, множества и файлы.

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

Массивы

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

uses

SysUtils;

type

Gatchenko=array [0..4] of char;

Sidorenko=array [byte] of Single;

var

s:Sidorenko;

g:Gatchenko;

i:integer;

begin

...

s[17]:=ord(g[i-1])/10;

...

end.

Описание типа массива задается следующим образом:

<имя типа> = array [ <сп. инд. типов> ] of <тип>;

Здесь <имя типа> – правильный идентификатор; array, of – зарезервиро­ванные слова (массив, из); <сп. инд. типов> – список из одного или нескольких индексных типов, разделенных запятыми; квадратные скобки, обрамляющие спи­сок, – требование синтаксиса; <тип> – любой тип Delphi.

В качестве индексных типов в Delphi можно использовать любые порядковые типы, имеющие мощность не более 2 Гбайт (то есть кроме LongWord и Int64).

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

Var

a, b: array [1..10] of Real;

Обычно в качестве индексного типа используется тип-диапазон, в котором за­даются границы изменения индексов. Так как тип <тип>, идущий в описании мас­сива за словом of, – любой тип Delphi, то он может быть, в частности, и другим массивом, например:

Type

mat = array [0..5] of array [-2..2] of array [Char] of Byte;

Такую запись можно заменить более компактной:

Type

mat = array [0..5, -2..2, char] of Byte;

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

Над массивами не определены операции отношения. Нельзя, например, запи­сать:

if a = b then...

Сравнить два массива можно поэлементно, например:

Var

a, b: array [1..5] of Single;

eq: Boolean;

i: Byte;

Begin

eq:= True;

for i:= 1 to 5 do

if a[i] <> b[i] then

eq:= False;

if eq then

End.

Динамические массивы

В версии Delphi 4 впервые введены динамические массивы. При объявлении динамических массивов в программе не следует указывать границы индексов:

Var

A: array of Integer;

В: array of array of Char;

C: array of array of array of Real;

В этом примере динамический массив А имеет одно измерение, массив В – два и массив С – три измерения. Распределение памяти и указание границ индексов по каждому измерению динамических массивов осуществляется в ходе выполне­ния программы путем инициализации массива с помощью функции SetLength. В ходе выполнения следующего оператора одномерный динамический массив А будет инициализирован,то есть получит память, достаточную для размещения трех целочисленных значений:

SetLength(A,3);

Нижняя граница индексов по любому измерению динамического массива все­гда равна 0, поэтому верхней границей индексов для А станет значение 2.

Фактически идентификатор динамического массива ссылается на указатель, содержащий адрес первого байта памяти, выделенной для размещения массива. Поэтому для освобождения этой памяти достаточно присвоить идентификатору значение NIL (другим способом является использование процедуры Finalize):

Var

А, В: array of Integer;

Begin

// Распределяем память:

SetLength(A,10);

SetLength (B,20);

// Используем массивы:

// Освобождаем память:

А:= NIL;

Finalize(В);

end;

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

В многомерных массивах сначала устанавливается длина его первого измере­ния, затем второго, третьего и т. д. Например, так создается динамический мас­сив 3х3:

Var

A: array of array of Integer;

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

Begin

// Устанавливаем длину первого измерения

//(количество столбцов):

SetLength(A,3);

// Задаем длину каждого столбца:

SetLength(A[0], 3);

SetLength(A[1],3);

SetLength(A[2], 3);

end;

SetLength – одна из немногих стандартных подпрограмм, кото­рая допускает обращение с переменным количеством параметров. Вместо четырех строк в предыдущем примере можно использовать одну:

SetLength(А, 3, 3);

В отличие от обычных массивов стандартного языка Пас­каль (и Delphi), динамические массивы могут иметь разную длину по второму и сле­дующим измерениям. В предыдущем примере определен квадратный массив 3x3. Однако ничто не мешает создать, например, треугольный массив (обращаться к подпрограмме SetLength с количеством параметров более трех нельзя):

SetLength(А,3);

// Задаем длину каждого столбца:

SetLength(А[0], 3);

SetLength(А[1], 4);

SetLength(А[2], 5);

В многомерных динамических массивах каждый элемент любого из N-1 изме­рений (N – количество измерений) представляет собой динамический массив и, следовательно, нуждается в инициализации. Вот как, например, можно инициа­лизировать вещественный кубический массив 3x3x3:

Var

A: array of array of array of Real;

i, j: Integer;

Begin

SetLength(A,3);

for i:= 0 to 2 do

Begin

SetLength(A[i],3);

for j:= 0 to 2 do

SetLength(A[i, j],3);

end;

end;

Записи

Запись – структура данных, состоящая из фиксированного количества компо­нентов, называемых полями записи. В отличие от массива, компоненты (поля) за­писи могут быть разного типа. Чтобы можно было ссылаться на тот или иной ком­понент записи, поля именуются.

Структура объявления типа записи такова:

<имя типа> = record <сп. полей> end;

Здесь <имя типа> – правильный идентификатор; record, end – зарезерви­рованные слова (запись, конец); <сп. полей> – список полей; представляет со­бой последовательность разделов записи, между которыми ставится точка с запя­той.

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделенных друг от друга запятыми. За идентификатором (идентификато­рами) ставится двоеточие и описание типа поля (полей), например:

Type

BirthDay = record

Day, Month: Byte;

Year: Word

end;

Var

a, b: Birthday;

В этом примере тип BirthDay (день рождения) есть запись с полями Day, Month и Year (день, месяц и год); переменные А и В содержат записи типа BirthDay.

Как и в массиве, значения переменных типа записи можно присваивать другим переменным того же типа, например:

а:= b;

К каждому из компонентов записи можно получить доступ, если использовать составное имя, то есть указать имя переменной, затем точку и имя поля:

a.day:= 27;

b.year:= 2002;


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.)