Структура - это переменная, которая содержит в себе набор других переменных, которые могут быть разных типов.
Пример:
struct
{
char sym;
int num;
}myvar;
Тут определена переменная myvar, которая представляет собой структуру. Доступ к элементам структуры осуществляется через точку:
myvar.sym = 4;
myvar.num = 40;
Если имеется указатель на структуру, то доступ к элементам с помощью
указателя происходит через стрелку. Для этого нужно создать тип нашей
структуры с помощью typedef, и объявить указатель с типом нашей
структуры:
typedef struct
{
char sym;
int num;
}tMyStruct;
tMyStruct myvar;
tMyStruct* p;
...
p = &myvar;
p->sym = 5;
p->num = 500;
С помощью структур можно применять битовые поля, которые упаковываются в
число, при этом память экономится. Компилятор IAR для AVR определяет
минимальный объем памяти, который выделяется под структуру, в 2 байта,
даже если количество бит в структуре меньше или равно 8 (для 8 бит было
бы достаточно одного байта). Далее, когда объем бит превышает 16,
выделяется уже 4 байта, и т. д. - объем выделяемой для битовой структуры
памяти почему-то всегда кратен 2 байтам. Примеры битовых структур:
typedef struct
{
unsigned A : 1;
unsigned B : 1;
} t2;
typedef struct
{
unsigned A : 1;
unsigned B : 1;
unsigned C : 1;
unsigned D : 1;
} t4;
typedef struct
{
unsigned A : 1;
unsigned B : 1;
unsigned C : 1;
unsigned D : 1;
unsigned E : 1;
unsigned F : 1;
unsigned G : 1;
unsigned H : 1;
} t8;
typedef struct
{
unsigned A : 1;
unsigned B : 1;
unsigned C : 1;
unsigned D : 1;
unsigned E : 1;
unsigned F : 1;
unsigned G : 1;
unsigned H : 1;
unsigned Y : 1;
} t9;
typedef struct
{
unsigned A : 1;
unsigned B : 1;
unsigned C : 1;
unsigned D : 1;
unsigned E : 1;
unsigned F : 1;
unsigned G : 1;
unsigned H : 1;
unsigned Y : 8;
} t16;
typedef struct
{
unsigned A : 1;
unsigned B : 1;
unsigned C : 1;
unsigned D : 1;
unsigned E : 1;
unsigned F : 1;
unsigned G : 1;
unsigned H : 1;
unsigned Y : 9;
} t17;
t2 _A2; //выделяется 2 байта, хотя достаточно одного
t4 _A4; //выделяется 2 байта, хотя достаточно одного
t8 _A8; //выделяется 2 байта, хотя достаточно одного
t9 _A9; //выделяется 2 байта
t16 _A16; //выделяется 2 байта
t17 _A17; //выделяется 4 байта, хотя достаточно 3-х
Очень интересен тип данных union,
который позволяет один выделенный блок памяти интерпретировать
по-разному, что позволяет удобно манипулировать данными и одновременно
экономить память. Например,
union
{
uint i;
t9 bf;
}myunion;
Переменная myunion может выступать либо как целое myunion.i, либо как
структура myunion.bf типа t9 (см. ранее определение типа t9), то есть
набор битов myunion.bf.A, myunion.bf.B и т. д., что позволяет, например,
менять переменную myunion.i, манипулируя битами myunion.bf. Младший D0
бит i будет всегда равен myunion.bf.A, D1 будет равен myunion.bf.B, и т.
д.
|
Комментарии
microsin: когда статья писалась, то я еще не знал про выравнивание. И сейчас не уверен, что стоит про выравнивание здесь упоминать, так как управление выравниванием (#pragma pack и проч.) может выглядеть для каждого компилятора по-своему. Т. е. это зависит от среды программировани я (компилятора).
RSS лента комментариев этой записи