STM32: struct-Pointer auf Array -> falsche Werte

OP #2479192
Lesenswert?
• ▲
▼
Hallo zusammen,
ich habe folgendes Array und Struct:
1
unsigned char array[10] = {1,2,3,4,5,6,7,8,9,0};
2
struct strct {
3
    unsigned char one[2];
4
    unsigned char two[3];
5
    unsigned int three;
6
};
Das ist global definiert.

In Main erstelle ich einen struct pointer
1
struct strct *test;

und lasse diesen Pointer auf den Anfang des Arrays zeigen:
1
test = (struct strct*)&array;

Ich erwarte mir dann folgendes:
one = [1,2]
two = [3,4,5]
three = 1543   (6<<8 | 7)

Im debugger bekomme ich für one und two auch die gewünschten Werte, 
three hat aber den wert 9.
Auf den AVRs hat alles wie gewünscht funktioniert, auf dem STM32 
(Discovery-Board) aber nicht.

Wie komme ich also möglichst einfach zum gewünschten Ergebnis?
Gast #2479202
Lesenswert?
• ▲
▼
Der STM hat eine Wortbreite von 32Bit kann aber auch gut mit 16Bit 
umgehen.

Du siehst das die unerwartete 9 genau nach 8 unsigned char auftritt.

Compiler (welchen hast Du denn?) neigen dazu, structs möglichst so 
aufzuteilen, das die Wortbreite auf Befehle passt die eine schnelle 
Verarbeitung ohne Schieben erlauben.

Von einer anderen Warte aus, ist es bei structs implementierungsabhängig 
wie die Mitglieder angeordnet sind. Es gibt keine Garantie, das sie im 
Speicher unmittelbar aufeinander folgen.

Da sich aber diese Tricks eingebürgert haben bzw. irgendwann mal von den 
Programmierern gefordert wurde, das sie möglich sien sollen, wurden 
verschiedene sogenannte "Pragmas" eingeführt die aber nicht zum Standard 
von C gehören.

In Deinem Fall solltest Du schauen, ob es ein pragma "Pack" gibt und das 
unmittelbar vor die Strukturdeklaration legen. Dann klappts.
OP #2479582
Lesenswert?
• ▲
▼
Hallo, danke für die Antwort.
Ich benutze den GCC. Das mit dem pragma pack sieht mir aber auch recht 
kompliziert aus... werde mich da noch etwas genauer einlesen.
Ansonsten hilft wohl nur ein Zwischenschritt über eine neue 
int-variable, in der die zwei unsigend-chars aus dem array 
zusammengefügt werden.
Gast #2479910
Lesenswert?
• ▲
▼
>Das mit dem pragma pack sieht mir aber auch recht kompliziert aus

Das ist im Gegenteil recht einfach.
Eben nur "#pragma pack" vor die Strukturdeklaration setzen. Dann ordnet 
der Compiler die Strukturmitglieder direkt aufeinanderfolgend an und 
erzeugt Code der das berücksichtigt.

Lies Dir einfach mal die Doku durch.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.