Типы данных в Delphi, определенные пользователем

Нестандартные типы данных очень часто используются в программирова­нии, поскольку они более информативны, нежели стандартные типы, и по­тому, что их применение ведет к созданию более четкого кода. Это особенно спра­ведливо в отношении записей. Но прежде чем приступать к изучению создания и использования записей, необходимо разобраться в создании и использовании пе­речислимых типов, подтипов и множеств.  


Перечислимый тип — это упорядоченный список идентификаторов, который может служить хорошей заменой коллекции констант. Например, следующие кон­станты можно заменить перечислением:

 

const
PAWN = 1;
ROOK = 2;
KNIGHT = 3;
BISHOP = 4;
QUEEN = 5;
KING = 6;
 

Для объявления перечислимого типа применяется следующий синтаксис:

type 

ТПеречислимыйТип = (значение_1, значение_2,  значение_n);
TChessFigure =  (cfPawn,  cfRook, cfKnight, cfBishop,  cfQueen, cfKing);
 

Использование переменной TChessFigure вместо целочисленной переменной делает код более читабельным и позволяет компилятору Delphi осуществлять проверку типа. Каждый идентификатор в перечислении получает порядковое значение. Порядковые значения в перечислении начинаются с 0. Таким обра­зом, Ord(cf (Pawn) равно 0.

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

Порядковое значение элемента перечисления можно определить также явно:


 

 

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

 


 

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

 

НовоеМиожество = set of ПеречислимыйТип;

 

Множества действительно просты в использовании и позволяют работать с коллекцией значений. Переменная типа множества занимает всего один байт па­мяти. Следующий код иллюстрирует объявление нового множества на основе пе­речисления TDay и присвоение пустого множества переменной ThisWeek:

 


 

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

 


 

Обычно эти операции служат для добавления или удаления элементов из мно­жества. Однако по возможности вместо них следует применять процедуры Exclude и Include, поскольку процедуры работают быстрее, чем операции:

 

Exclude(ThisWeek,  Friday);
Include(ThisWeek,  Saturday); Include(ThisWeek,  Sunday);

 

 Зарезервированное слово in можно использовать для определения, присутст­вует ли во множестве указанное значение. Например, для выяснения, содержит ли множество ThisWeek элемент Wednesday, служит приведенный ниже код:

 

 

Для просмотра множества можно использовать любой из доступных циклов, в том числе цикл f or-in, применение которого требует наименьшего объема ввода с клавиатуры и ведет к созданию наиболее читабельного кода.

Листинг 7.1. Работа с множествами


 

 Запись — это структурированный тип данных, состоящий из ряда элементов. В отличие от массива, который представляет собой просто группу переменных с общим именем и типом данных, запись — это тип данных, который содержит эле­менты (поля) различных типов. Для создания новой записи необходимо использо­вать зарезервированное слово record и объявить поля внутри блока записи. В действительности объявления полей — это объявления стандартных переменных.

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

 


 

После создания новый тип записи можно использовать для объявления пере­менной этого типа:

 


 

Для получения доступа к полям в записи применяется синтаксис с использова­нием точки:

 

Запись.Поле

 

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

 

 

 

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

Синтаксис записи блока with показан ниже:

 


 

Блок with позволяет уменьшить объем исходного кода, особенно при использо­вании записи с большим количеством полей или записи с действительно длинным именем.

 


 

Следующий пример иллюстрирует определение полей записи в другой записи и использование массивов записей.

Листинг 7.2. Использование записей  

 


 

При создании процедур и функций, которые принимают запись в качестве па­раметра, этот параметр должен быть объявлен как параметр-переменная или па­раметр-константа. Если поля в записи требуется изменять, следует использовать параметр-переменную. Если необходимо выполнять только считывание значений полей, следует использовать параметр-константу.

 

При использовании стандартного параметра-значения процедура вынуждена создавать копию всей записи при каждом ее вызове. В данном случае при передаче параметра-значения процедура должна скопировать 92 байта (SizeOf (TBook)). При использовании параметра-константы или параметра-переменной вызов процедуры должен передать только адрес переменной, который занимает всего 4 байта.

 


 

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

dle

Помоги проекту! Расскажи друзьям об этом сайте: