Программирование PC Структуры в C Sat, December 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Структуры в C Печать
Добавил(а) microsin   

Структура - это переменная, которая содержит в себе набор других переменных, которые могут быть разных типов.

Пример:
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, и т. д.

 

Комментарии  

 
0 #1 snoway 02.11.2011 15:30
Выравнивать структуры (битовые поля) не пробовал? Во-первых, со стороны pragma pack. Во-вторых, с определения самих полей - не в тупняк unsigned писать, а выравнивать группы бит на границу байта, слова, и т.п.?

microsin: когда статья писалась, то я еще не знал про выравнивание. И сейчас не уверен, что стоит про выравнивание здесь упоминать, так как управление выравниванием (#pragma pack и проч.) может выглядеть для каждого компилятора по-своему. Т. е. это зависит от среды программировани я (компилятора).
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page