C und Bitfelder und Structs...
Bio
- programmiertechnik
Sup!
Ich hatte heute einen jener genialen Einfaelle, die dadurch zerstoert zu werden pflegen, dass sie einfach nicht umsetzbar sind... und zwar wollte ich einen eigenen Datentyp - typedef struct {bit1 :1; bit2 :1; ... bit8 :1} foo - kreieren, dann char-Variablen auf diesen Typ casten - var = (foo) byte; - und dann mit var.bit1 ... auf die einzelnen Bits zugreifen.
Nun kann man aber offensichtlich keine anderen Datentypen auf structs casten und ebenso offensichtlich ist es Sache des Compilers, wieviele Byte eine struct lang ist.
Kann man da evtl. irgendwas machen? Durch die Brust ins Auge? Mit Zeigern?
Und vor allem - warum geht das nicht, ich werd' noch bloede mit der Scheisse hier, 180 Puls hab' ich - bald!
Gruesse,
Bio
Hallo Bio,
Kann man da evtl. irgendwas machen? Durch die Brust ins Auge? Mit Zeigern?
Warum so kompliziert?
unsigned char x = 'A';
int bit1 = (x >> 7) & 0x01;
int bit2 = (x >> 6) & 0x01;
int bit3 = (x >> 5) & 0x01;
int bit4 = (x >> 4) & 0x01;
int bit5 = (x >> 3) & 0x01;
int bit6 = (x >> 2) & 0x01;
int bit7 = (x >> 1) & 0x01;
int bit8 = x & 0x01;
Grüße,
Christian
Hallo Bio nochmal,
Kann man da evtl. irgendwas machen? Durch die Brust ins Auge? Mit Zeigern?
Wenn Du es mit Zeigern lösen willst, dann ginge _vielleicht_ (bin zu faul, um es zu testen) auch das:
typedef struct _mybyte { /* bitfeld-deklaration */} mybyte;
mybyte tuewas (unsigned char a) {
mybyte *b;
b = (mybyte *)(&a);
return *b;
}
_Könnte_ klappen, muss es aber nicht. Beachte auch, dass einige Prozessorarchitekturen Bitfelder von Links nach Rechts und andere von Rechts nach Links codieren.
Grüße,
Christian
Hi,
Nun kann man aber offensichtlich keine anderen Datentypen auf structs casten und ebenso offensichtlich ist es Sache des Compilers, wieviele Byte eine struct lang ist.
Genau, aber sei's drum, du kannst doch eine union definieren.
struct BF{
bitfelder wie gehabt (1 x unsigned char)
};
union foo{
struct BF b;
unsigned char c;
};
Das sollte gehen. Fragt sich nur ob's Sinn macht.
micha
Hallo Bio,
und zwar wollte ich einen eigenen Datentyp - typedef
struct {bit1 :1; bit2 :1; ... bit8 :1} foo - kreieren,
dann char-Variablen auf diesen Typ casten -
var = (foo) byte; - und dann mit var.bit1 ... auf die
einzelnen Bits zugreifen.
Noe, geht so nicht. Vor allem, was sollen 'bit1', etc. sein?
Die kleinste adressierbare Einheit ist immer noch ein Byte
(auf PCs und den meisten der heutigen Architekturen 8 Bit).
Mal ganz abgesehen von den Big- und Small-Endians. Nene, wenn
du Bits schalten musst, wirst du auf &|^~ zurueckgreifen
muessen.
Nun kann man aber offensichtlich keine anderen Datentypen
auf structs casten
Klar geht das:
ckruse@sunshine:~ $ cat test.c
int main(int argc,char *argv[]) {
int x;
struct {
int x;
long y;
} blahr;
x = (int)blahr;
return 0;
}
ckruse@sunshine:~ $ gcc -Wall -ansi -pedantic -o test test.c
test.c: In function `main':
test.c:9: aggregate value used where an integer was expected
ckruse@sunshine:~ $
(ueberigens berechtigte Warnungen -- arbeite in dem Fall
lieber mit Pointer:
ckruse@sunshine:~ $ cat test.c
int main(int argc,char *argv[]) {
int *x;
struct {
int x;
long y;
} *blahr;
x = (int *)blahr;
return 0;
}
ckruse@sunshine:~ $ gcc -Wall -ansi -pedantic -o test test.c
ckruse@sunshine:~ $
)
und ebenso offensichtlich ist es Sache des Compilers,
wieviele Byte eine struct lang ist.
Nein, nicht wirklich. Aber um die Groesse eines Structs
festzustellen, gibts sizeof().
Gruesse,
CK