Язык С позволяет создать переменную, для которой в описании можно перечислить все возможные ее значения. Синтаксис описания таков
enum
{
значение1,
значение2,
значение3,
значение4,
…
} идентификатор1, идентификатор2, …;
Каждое значение в описании перечисления представляет собой символическое имя, с которым связано его числовое значение целого типа. Параметру значение1 будет по умолчанию соответствовать целое значение 0, параметру значение2 будет соответствовать целое значение 1 и т.д. Переменные идентификатор1, идентификатор2 могут принимать только перечисленные значения.
Также как и для структур возможно описание тега перечисления.
enum тег
{
значение1,
значение2,
значение3,
значение4,
…
};
Тогда переменную можно описать как
enum тег идентификатор;
Ключевое слово enum может быть опущено.
Ниже описана переменная, с помощью которой можно моделировать поведение светофора.
enum e_traffic_light
{
TL_OFF,
TL_FLASH_YELLOW,
TL_RED,
TL_YELLOW,
TL_GREEN
};
e_traffic_light tlight;
tlight = TL_RED;
|
|
…
switch(tlight)
{
case TL_OFF:
case TL_FLASH_YELLOW:
check_PDD();
break;
case TL_RED:
stop();
break;
case TL_YELLOW:
ready();
break;
case TL_GREEN:
go();
break;
}
Светофор может быть в пяти состояниях – выключен, мигать желтым светом, гореть красным, желтым или зеленым светом. В перечислении этим состояниям соответствуют значения TL_OFF, TL_FLASH_YELLOW, TL_RED, TL_YELLOW, TL_GREEN. Фактически описанная ниже переменная tlight может принимать целые значения в диапазоне 0..4 в виде символических имен. Переменную можно использовать, например, в операторах присваивания, переключения и т.д. Так в операторе переключателе проверяется значение переменной. Если светофор выключен или мигает желтым светом, то вызывается функция check_PDD(), в которой выполняются операции управления движением некоторого транспортного средства в соответствии правилами дорожного движения – необходимо пропустить пешеходов, выполнить требования дорожных знаков и разметки и т.д. Если светофор горит красным светом, то вызывается функция stop(), в которой выполняются операции остановки транспортного средства. Если светофор горит желтым светом, то вызывается функция ready(), в которой выполняются операции подготовки к движению транспортного средства. Если светофор горит зеленым светом, то вызывается функция go(), в которой выполняются операции движения транспортного средства.
Можно также задавать константные значения элементам перечисления. В примере описано перечисление, которое можно использовать для моделирования переключателя автоматической коробки передач автомобиля. Переключатель может находиться в таких положениях:
· Parking – стоянка автомобиля;
|
|
· Neutral – нейтральный режим, например, при кратковременной стоянке;
· Drive – режим движения;
· Low – режим движения на пониженной передаче в сложных условиях;
· Reverse – режим заднего хода.
Кроме этих режимов могут быть дополнительные режимы движения. Из описания видно, что есть несколько режимов движения и отдельный режим парковки. Для обработки режимов движения удобно, чтобы их числовые значения отличались на 1. Значение режим парковки должно отличаться от остальных значительно. Перечисление будет иметь такой вид.
enum e_autogearbox_lever
{
AGL_PARKING = 100,
AGL_REVERSE = -1,
AGL_NEUTRAL,
AGL_DRIVE,
AGL_LOW
};
Для символического имени AGL_PARKING явно задано числовое значение 100, для символического имени AGL_REVERSE явно задано числовое значение -1. Числовые значения для имен AGL_NEUTRAL, AGL_DRIVE, AGL_LOW на 1 больше предыдущего, т.е. символическому имени AGL_NEUTRAL соответствует значение 0, имени AGL_DRIVE соответствует значение 1 и имени AGL_LOW соответствует значение 2.