Студопедия — Динамические массивы
Студопедия Главная Случайная страница Обратная связь

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

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






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

Var

A: array of Integer;

В: array of array of Char;

C: array of array of array of Real;

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

SetLength(А,3);

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

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

Var

А,В: array of Integer;

Begin

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

SetLength(A,10);

SetLength(B,20);

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

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

А:= NIL;

Finalize(В);

End;

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

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

Var

A: array of array of Integer; //Двумерный динамический массив begin

//Устанавливаем длину первого измерения (количество столбцов):

SetLength(A,3);

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

SetLength(A[0],3);

SetLength(A[l],3);

SetLength(A[2],3);

End;

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

SetLength(A,3);

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

SetLength(A[0],3);

SetLength(A[l],4);

SetLength(A[2],5);

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

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;

7.2.2. Записи

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

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

<имя типа> = 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:= 1939;

Для вложенных полей приходится продолжать уточнения:

Type

BirthDay = record Day,Month: Byte;

Year: Word end;

Var

с: record

Name: String;

Bd: BirthDay end;

Begin

if c.Bd.Year = 1989 then... end.

Чтобы упростить доступ к полям записи, используется оператор присоединения with:

with <переменная> do <оператор>;

Здесь with, do - зарезервированные слова (с, делать);

<переменная> - имя переменной типа запись, за которой, возможно,

следует список вложенных полей; <оператор> - любой оператор Object Pascal.

Например:

с.Bd.Month:= 9;

Это эквивалентно

with c.Bd do Month:= 9;

или with с do with Bd do Month:= 9;

или with с, Bd do Month:= 9;

Object Pascal разрешает использовать записи с так называемыми вариантными полями, например:

Type

Forma = record Name: String;

case byte of

0: (Birthplace: String [40]);

1: (Country: String [20];

EntryPort: String [20];

EntryDate: 1..31;

ExitDate: 1..31)

End;

В этом примере тип Forma определяет запись с одним фиксированным полем Name и вариантной частью, которая задается предложением case... of. Вариантная часть состоит из нескольких вариантов (в примере - из двух вариантов: 0 и 1). Каждый вариант определяется константой выбора, за которой следуют двоеточие и список полей, заключенный в круглые скобки. В любой записи может быть только одна вариантная часть, и, если она есть, она должна располагаться за всеми фиксированными полями.

Замечательной особенностью вариантной части является то обстоятельство, что все заданные в ней варианты “накладываются” друг на друга, т. е. каждому из них выделяется одна и та же область памяти.

Это открывает дополнительные возможности преобразования типов, например:

Var

Mem4: record case Byte of

0: (by: array [0..3] of Byte);

1: (wo: array [0..1] of Word);

2: (lo: Longint);

End;

В этом примере запись мет4 имеет три варианта, каждый из которых занимает в памяти один и тот же участок из 4 байт. В зависимости от того, к какому полю записи мы обращаемся в программе, этот участок может рассматриваться как массив из 4 байт (поле by), массив из двух целых типа word (поле wo) или, наконец, как одно целое число типа Longint (поле l0). Например, этой записи можно сначала присвоить значение как длинному целому, а затем проанализировать результат по байтам или словам:

Var

х: Word;

xb: Byte;

xl: Longint;

Begin







Дата добавления: 2015-10-18; просмотров: 518. Нарушение авторских прав; Мы поможем в написании вашей работы!



Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

Случайной величины Плотностью распределения вероятностей непрерывной случайной величины Х называют функцию f(x) – первую производную от функции распределения F(x): Понятие плотность распределения вероятностей случайной величины Х для дискретной величины неприменима...

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

Оценка качества Анализ документации. Имеющийся рецепт, паспорт письменного контроля и номер лекарственной формы соответствуют друг другу. Ингредиенты совместимы, расчеты сделаны верно, паспорт письменного контроля выписан верно. Правильность упаковки и оформления....

БИОХИМИЯ ТКАНЕЙ ЗУБА В составе зуба выделяют минерализованные и неминерализованные ткани...

Типология суицида. Феномен суицида (самоубийство или попытка самоубийства) чаще всего связывается с представлением о психологическом кризисе личности...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия