Struct hat unerwartete Größe

OP #4087302
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.
Gast #4087312
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.
OP #4087348
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.
OP #4087373
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren