Ak uz z pamatovych dovodov chces pouzit jednotlivé bity, co takto vyuzit standartne bitove polia? A nielen pre premenne s dlzkou jedneho bitu.
napriklad pre kodovanie casu mozes pouzit zapis
(priklad je z knihy Vaclav Kadlec: Ucime se programovat v jazyce C, jedna z najlepsich kniziek o C, ktore sa mi dostali do ruky. Skoda ze nespravili dotlac)
typedef struct {
unsigned sec : 5; // ulozene v bitoch 0 -4
unsigned min : 6; // ulozene v bitoch 5 -10
unsigned hod : 5; // ulozene v bitoch 11 -15
} CAS;
CAS time;
time.sec = 20;
time.min = 13;
time.hod = 7;
je jasne, ze kludne mozes zapisat
#define ZAP 1
#define VYP 0
typedef struct {
unsigned rele1 : 1;
unsigned rele2 : 1;
unsigned rele3 : 1;
unsigned rele4 : 1;
unsigned rele5 : 1;
unsigned rele6 : 1;
} RELE;
RELE moje_rele;
// a neskor v kode
moje_rele.rele1 = ZAP;
// ...
moje_rele.rele1 = VYP;
vobec sa nemusis starat, ci bude pole bitovych zhlukov v jednom alebo v dvoch bajtoch.
obdobne mozes napisat
typedef struct {
unsigned rele1 : 1;
unsigned rele2 : 1;
unsigned rele3 : 1;
unsigned rele4 : 1;
unsigned rele5 : 6;
unsigned cislo6 : 7;
} RELE;
volatile RELE moje_rele;
// ...
moje_rele.cislo6 = 35;
// ...
prekladac to prelozi nasledovne (AVR-GCC)
147: moje_rele.rele6 = 35;
+000012BB: 918005ED LDS R24,0x05ED Load direct from data space
+000012BD: 7083 ANDI R24,0x03 Logical AND with immediate
+000012BE: 688C ORI R24,0x8C Logical OR with immediate
+000012BF: 938005ED STS 0x05ED,R24 Store direct to data space
+000012C1: 918005EE LDS R24,0x05EE Load direct from data space
+000012C3: 7F8E ANDI R24,0xFE Logical AND with immediate
+000012C4: 938005EE STS 0x05EE,R24 Store direct to data space
tento sposob programovania je funkcny, len sa moc nepouziva, lebo pamate je vela a casu malo. Z disasembleru je jasne, ze tento sposob je casovo narocnejsi. A to i pri praci s jednym bitom. No nedalo mi ho tu neuviest. Povazujem ho za literarne cistejsi, ako rozne hrozne programatorove maskovania bitov v bajte, pri ktorych interpretacii sa i autor sam vie lahko zamotat. 