Christian Kruse: C und Bitfelder und Structs...

Beitrag lesen

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