Переменной называют структуру, в состав которой входит хотя бы 1 смесь.
Пример.
Паспортные данные:
- фамилия и.о.,
- серия,номер,
- дата рождения,
- место рождения,
- национальность,
- прописка,
- семейное положение:холост|женат|разведен,
- переменная часть,
- военнообязанный:да|нет.
Общая схема построения такой структуры следующая:
struct{
общие компоненты,
признак активной компоненты (тэг),
union{
переменные компоненты
}<имя>;
........................................................
}<имя структуры>;
Тэгом называют переменную, значение которой определяет, какой элемент объединения занимает память в данный момент.
Пример.
enum sem_pol{holost, genat, razveden};
struct pasport{
char fio[30];
char nomer[12];
struct data birthdate;
char mesto[15];
char nation[15];
char propis[40];
enum sem_pol pr;
union{
/* холост - пусто */
/* женат */
struct{
struct data svadba;
charwife_fio[30];
unsignedchislo_children;
struct{
char name[15];
char pol;
struct data birthdate;
}children[PAZMEP];
}sostav;
/* разведен */
struct data razvod_day;
}sem_sost;
unsigned priziv;
};
10.8. Тип variant (B)
Данные типа variant могут содержать значения других типов данных во время выполнения одной программы. Переменные этого типа или, вообще, не имеют определения (неявное объявление) или объявляются с ключевым словом variant:
dim <имя_переменной> as variant.
Если такой переменной задается числовое значение, то объем памяти под нее составляет 16 байтов, если – строковое, то 22 байта + длина строки. В операторах переменные типа variant ведут себя в соответствии с типом присвоенного значения. Если было присвоено значение типа integer, то переменная работает как целая, если – типа string, то – как строка. Транслятор сам распознает внутренний тип переменной.
Замечание. На первый взгляд применение данных типа variant удобно. Их можно не объявлять, не думать о преобразованиях значений в операторах, предо-ставляя это транслятору. Однако есть следующие возражения:
- данные занимают, в общем случае, больше памяти, чем обычные типы;
- их употребление может привести к труднообнаруживаемым ошибкам.
Например, оператор "+" применим и к числовым, и к строковым данным. В первом случае он выполняет операцию сложения, во втором – сцепление.
Пример.
a="10"
b="11"
a+b à "1011"
b=11
a+b à 21
Если один операнд типа variantсодержит числовое значение, а второй – строковое, то второй операнд будет преобразован в число, если это возможно, если нет, то возникнет ошибка Type mismatch(Несогласование типов). При необходимости получения строкового результата нужно использовать оператор "&".
Рекомендация. По возможности не следует использовать данные типа variant. По крайней мере, это надо делать при достаточном опыте программирования.