Вчера была лекция по этому типу данных!! Вот она, может поможет чем-то!!
VT_NONE – тип переменной не определен;
VT_INT – целочисленный тип;
VT_FLOAT – вещественный тип;
VT_CHAR – символьный тип.
Этого можно достичь, если type_var определить как перечисляемый тип, который задается с помощью ключевого слова enum следующим образом:
C++ |
1
| enum tag_type {VT_NONE, VT_INT, VT_FLOAT, VT_CHAR}; |
|
При этом объявление перечисляемого типа выполняется подобно объявлению структуры или объединения:
C++ |
1
| enum tag_type type_var; |
|
В результате для введенной переменной перечисляемого типа допустимо использование следующих операторов:
C++ |
1
2
3
| type_var = VT_INT; //переменная type_var принимает значение VT_INT
if(type_var == VT_NONE) // проверка
for(type_var = VT_NONE; type_var <= VT_CHAR; type_var++) //цикл |
|
Анализ последнего оператора for показывает, что значения перечисляемого типа VT_NONE,…,VT_CHAR являются числами, которые имеют свои имена. Причем, VT_NONE = 0, VT_INT = 1, …, VT_CHAR = 3. В некоторых случаях использование имен удобнее использования цифр, т.к. их запоминать и ориентироваться в них проще, чем в числах.
Перепишем пример хранения разнородной информации с использованием перечисляемого типа, получим:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| enum tag_type {VT_NONE, VT_INT, VT_FLOAT, VT_CHAR};
struct tag_var {
union tag_value value;
enum tag_type type_var;
};
int main()
{
struct tag_var var[3];
var[0].type_var = VT_INT;
var[0].value.var_i = 10;
var[1].type_var = VT_FLOAT;
var[1].value.var_f = 2.3;
var[2].type_var = VT_CHAR;
var[2].value.var_ch = ‘d’;
for(int i = 0;i < 3;i++)
{
switch(var[i].type_var)
{
case VT_INT:printf(“var=%d\n”,var[i].value.var_i);break;
case VT_FLOAT:printf(“var=%f\n”,var[i].value.var_f);break;
case VT_CHAR:printf(“var=%c\n”,var[i].value.var_ch);break;
default: printf(“Значение переменной не определено\n”);
}
}
return 0;
} |
|
Из приведенного примера видно, что использование перечисляемого типа делает программу более понятной и удобной при программировании. Здесь следует отметить, что если объявлены два перечисления
C++ |
1
2
| enum color {red, green, blue} clr;
enum color_type {clr_red, clr_green, clr_blue} type; |
|
то числовые значения red, green, blue будут совпадать с соответствующими числовыми значениями vt_int, vt_float, vt_char. Это значит, что программный код if(clr == red) будет работать также как и if(clr == clr_red). Часто это не имеет принципиального значения, но, например, следующий оператор выдаст сообщение об ошибке:
C++ |
1
2
3
4
5
6
| switch(clr)
{
case red:printf(“Красный цвет\n”);break;
case green:printf(“Зеленый цвет\n”);break;
case clr_red:printf(“Красный оттенок\n”);break;
}; |
|
Ошибка возникнет из-за того, что значение red и значение clr_red равны одному числу – 0, а оператор switch не допускает такой ситуации. Для того чтобы избежать такой ситуации, при задании перечисляемого типа допускаются следующие варианты:
C++ |
1
2
3
| enum color_type {clr_red = 10, clr_green, clr_blue};
enum color_type {clr_red = 10, clr_green = 20, clr_blue = 30};
enum color_type {clr_red, clr_green = 20, clr_blue}; |
|
В первом случае значения clr_red = 10, clr_green = 11, clr_blue = 12. Во втором - clr_red = 10, clr_green = 20, clr_blue = 30. В третьем - clr_red = 0, clr_green = 20, clr_blue = 21. Как видно из полученных значений, величины могут инициализироваться при задании перечисления, а если они не объявлены, то принимают значение на единицу больше предыдущего значения.