Forum: PC-Programmierung Struct hat unerwartete Größe


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
ich verstehe gerade nicht, was mein Compiler aus meinem struct macht und 
warum.

Das ist mein struct:
1
  __extension__ typedef struct {
2
    unsigned char i2cError         : 1;
3
    unsigned char overCurrent      : 1;
4
    unsigned char stepLoss         : 1;
5
    unsigned char electricalDefect : 1;
6
    unsigned char thermalWarning   : 1;
7
    unsigned char thermalError     : 1;
8
    unsigned char chargePumpFail   : 1;
9
    unsigned char noMotor          : 1;
10
    unsigned char stuff            : 7;
11
    unsigned char unexpectedBehaviour : 1;
12
  } __attribute__((packed)) tmc222Diag_t;

Gebaut wird das Ganze mit MinGW64 unter Windows 7 mit fast ohne 
Optionen:
1
...
2
gcc -g -pg -Wall -Wextra -Wpedantic -std=c99 -c -o main.o
Und der Ergebnis ist: sizeof(tmc222Diag_t) ist 5!

Ich habe 2 erwartet: Es gibt nirgendwo ernsthafte Bytegrenzen, wo er 
irgendeine Form von Alignment durchführen sollte.

An was habe ich nicht gedacht?

Viele Grüße
W.T.

von (prx) A. K. (prx)


Lesenswert?

Bei mir kommt 2 raus.

: Bearbeitet durch User
von Bitflüsterer (Gast)


Lesenswert?

Bei mir auch 2. Zeige doch bitte mal auf welche Weise Du 
sizeof(tmc222Diag_t) ermittelst und ausgibst. Am besten wäre natürlich 
ein minimales, compilierbares und ausführbares Codebeispiel.

von Rolf M. (rmagnus)


Lesenswert?

Auch bei mir (unter 64-Bit-Linux) kommt 2 raus.

von Walter T. (nicolas)


Lesenswert?

Bitflüsterer schrieb:
> Am besten wäre natürlich
> ein minimales, compilierbares und ausführbares Codebeispiel.

Hallo zusammen,
peinlich, peinlich, peinlich. Ich habe das "__attribute__((packed))" 
hinzugefügt, nach dem Ändern des Headers aber nicht alle Dateien neu 
kompiliert.

Wie er allerdings vorher auf 5 Bytes kam, ist mir allerdings immer noch 
rätselhaft. 8 Hätte ich noch verstanden.

Naja, egal, also die Ursprungsfrage kann als "Problem between chair and 
keyboard" verbucht werden.

von (prx) A. K. (prx)


Lesenswert?

Walter Tarpan schrieb:
> peinlich, peinlich, peinlich. Ich habe das "__attribute__((packed))"
> hinzugefügt, nach dem Ändern des Headers aber nicht alle Dateien neu
> kompiliert.

Auch ohne "packed" kommt 2 raus.

von Walter T. (nicolas)


Lesenswert?

Ähem, konnte den Beitrag nicht mehr bearbeiten. Vorher sah es so aus:
1
  // Diagnosedaten: Inhalt aus Tmc222_Status1 in kondensierter Form
2
  __extension__ typedef struct {
3
    unsigned char i2cError         : 1;
4
    unsigned char overCurrent      : 1;
5
    unsigned char stepLoss         : 1;
6
    unsigned char electricalDefect : 1;
7
    unsigned char thermalWarning   : 1;
8
    unsigned char thermalError     : 1;
9
    unsigned char chargePumpFail   : 1;
10
    unsigned char noMotor          : 1;
11
    uint16_t stuff            : 7;
12
    unsigned char unexpectedBehaviour : 1;
13
  } __attribute__((packed)) tmc222Diag_t;
14
15
16
    static_assert(sizeof(tmc222Diag_t)==5,"miscalulated size");
Er hat also den uint16_t-Teil nicht an der tatsächlichen Bitbreite, 
sondern an 16 Bit ausgerichtet. Die 8 Bit danach wieder an 8 Bit.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.