Типы перечислений

На верх  Назад  Вперёд

Во Free Pascal поддерживаются типы перечислений. Вдобавок к реализации Turbo Pascal, Free Pascal поддерживает также расширенный C подобный стиль задания перечислений, где определенному элементу списка перечисления присвоено значение.


Перечислимый тип

304_1


(см. Глава 12 Выражения для того чтобы увидеть как использовать выражения) При использовании присвоенных перечисляемых типов, присвоенные элементы должны быть в списке в возрастающем числовом порядке, иначе компилятор будет генерировать ошибку. Выражения, используемые в присвоенных перечисляемых элементах, должны быть известны во время компиляции. Таким образом, следующее объявление является корректным объявлением перечисляемого типа:

Type

  Direction = ( North, East, South, West);

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

Type

  EnumType = (one, two, three, forty := 40,fortyone);

В результате порядковое число forty равно 40, а не 3, как это бы было без присвоения ': = 40'. Порядковый номер fortyone равен 41, а не 4, как это бы было без присвоения. После присвоения в перечисляемом объявлении компилятор добавляет 1 к присвоенному значению, чтобы присвоить его следующему перечисляемому элементу.

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

Type

EnumType = (one, two, three, forty := 40, thirty := 30);

Необходимо объявлять сорок и тридцать в правильном порядке. При использовании типов перечисления(имеется ввиду с присвоениями) важно помнить следующие моменты:

1.Функции Pred и Succ не могут использоваться на этом виде перечисляемых типов. Любая попытка вызвать их приведет к ошибке компилятора.

2.Перечисляемые типы хранятся с использованием типа по умолчанию, независимо от фактического числа значений: компилятор не пытается оптимизировать их для сохранения места. Это поведение может быть изменено с помощью директивы компилятора {$PACKENUM N} , которая указывает компилятору минимальное количество байтов, которые будут использоваться для перечисляемых типов.

Type

 

{$PACKENUM 4}

LargeEnum = ( BigOne, BigTwo, BigThree );

 

{$PACKENUM 1}

SmallEnum = ( one, two, three );

 

Var S : SmallEnum;

L : LargeEnum;

begin

WriteLn ('Small enum : ',SizeOf(S));

WriteLn ('Large enum : ',SizeOf(L));

end.

После запуска мы увидим следующее:

Small enum : 1
Large enum : 4

Больше информации можно найти в Справочник программиста Free Pascal в разделе директив компилятора.