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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.