Größe von Struct Felder ermitteln?



  • Hallo,

    ich greife auf eine structure zu und möchte die Größe aller felder überprüfen.
    Sofern die Felder ganze Bytes füllen, klappt es mit dem Befehl sizeof() wunderbar. Jedoch gibt es auch felder, die kleiner als ein Byte sind.

    Wie kann ich die Größe dieser Felder ermitteln?

    Ich greife unter Linux auf die structure iph zu und will mich vergewissern, dass z.B. das versionsfeld auch wirklich nur 4bit lang ist. Mit sizeof geht das nicht.

    sizeof(iph->version)

    --
    Gruß
    slayer977



  • slayer977 schrieb:

    Jedoch gibt es auch felder, die kleiner als ein Byte sind.

    das koennen doch nur bitfelder sein!
    tja, pech. geht nicht. macht aber auch nichts, denn du weisst die groessen schon vor dem kompilieren, also spiel ein bisschen mit praeprozessor oder "const irgendwas" rum.



  • slayer977 schrieb:

    Jedoch gibt es auch felder, die kleiner als ein Byte sind.
    ...
    Wie kann ich die Größe dieser Felder ermitteln?
    ...

    du meinst bitfields?
    mit sizeof() geht's nicht. das liefert nur vielfache von bytes. ich wüsste jetzt leider keine möglichkeit wie man sowas machen kann...



  • Ja, sind Bitfelder. Habe ich gerade gelernt. 🙂

    Habe in meinem schlauen C Buch folgendes gefunden, evtl. geht es damit:

    #define offsetof(struct_type, member) \
    (size_t) &(((struct_type *)0->member)
    

    Damit bekomme ich den offset vom beginn der structure bis zu einem bestimmten feld. Evtl. kann ich hierdurch die bits zählen?

    Bin kein C Experte und habe die Syntax noch nicht ganz verstanden. Werde es mir morgen mal weiter anschauen. Jetzt gibt's erst mal Fussball 😉



  • nein kannst du nicht. in c kriegst du nur bytes adressiert. (vermutung) bitfields werden intern in shifts und logik (and, or, xor, not) umgewandelt.



  • c.rackwitz schrieb:

    (vermutung) bitfields werden intern in shifts und logik (and, or, xor, not) umgewandelt.

    wenn der prozessor bitweise 'set' und 'clear' instructions hat, werden die natürlich auch verwendet...


Anmelden zum Antworten