Gast
#712890
Hallo, ich möchte eine struct folgend benutzen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
nun hab ich das Problem das der C30 Compiler die 2 chars auf int auffüllt. Wie kann man sowas umgehen?
|
Anzeige
|
Struct C30(PIC)
Gast
#712890
Hallo, ich möchte eine struct folgend benutzen:
nun hab ich das Problem das der C30 Compiler die 2 chars auf int auffüllt. Wie kann man sowas umgehen? struct .. { ... } __attribute__((_packed_));
Besser: die struct umsortieren, vom grossen ins kleine, also erst alle
int, dann alle char.
Gast
#712903
Sorry vielleicht zu unverständlich Formuliert. Ich will Daten die über eine Schnittstelle kommen im richtigen Format haben. => 6 Zeichen über den pointer in die struct geschrieben sollen dann als 2x char und 1x int wert verarbeitet werden können vielen Dank für Hilfe Vorher dachte ich, ich hätte es verstanden. Jetzt verstehe ich garnichts mehr. Sorry. Andreas Kaiser wrote: > Vorher dachte ich, ich hätte es verstanden. Jetzt verstehe ich garnichts > mehr. Sorry. Ich denke, du hast ihn schon richtig verstanden und er sucht nach einer Möglichkeit das Padding abzustellen. Wie du schon geschrieben hast: struct .. { ... } __attribute__((packed)); macht das beim gcc. Ob er allerings einen gcc zum compilieren nimmt, kann er nur selbst sagen :-) Falls sein Compiler sowas nicht unterstützt (was unwahrscheinlich ist), kann ich nur sagen: Die oberste Compiler-Direktive beachten, die da lautet: Du sollst deinen Compiler nicht anlügen! char *ptr = (char*)&daten; ptr zeigt nicht auf ein char Feld. ptr zeigt immer noch auf eine Struktur. Auch der cast ändert daran nichts. Karl heinz Buchegger wrote: > Ob er allerings einen gcc zum compilieren nimmt, kann er nur > selbst sagen :-) Ich ging stillschweigend davon aus, dass er den C30 Compiler von Microchip meint. Wenn er natürlich TIs C30 meint... Andreas Kaiser wrote: > Karl heinz Buchegger wrote: > >> Ob er allerings einen gcc zum compilieren nimmt, kann er nur >> selbst sagen :-) > > Ich ging stillschweigend davon aus, dass er den C30 Compiler von > Microchip meint. Wenn er natürlich TIs C30 meint... Keine Ahnung. Kenne die PIC Compiler nicht. Aber irgendsoeine Einstellung zum Einstellen des Paddings hat wohl jeder Compiler. Vielleicht gibt es ja irgendwas in der Form #pragma pack(1) Für den OP: Sowas ist immer Compilerabhängig. Wie das bei dir konkret heist, steht in der Doku zum Compiler. Mit dem Stichwort 'Padding' solltest du im Index der Doku fündig werden.
Gast
#712920
Danke, leider bin ich durch die Datenfolge an die struct gebunden. Die __attribute__((packed)) wird bei mir vom Compiler mit einer Warnung Ignoriert. beste grüsse cnewbe wrote: > Die __attribute__((packed)) wird bei mir vom Compiler mit einer > Warnung Ignoriert. Wurde schon genannt: Doku lesen. Und wir wissen immer noch nicht, welcher C30 es ist. In der Doku vom Microchip jedenfalls steht das drin, der akzeptiert das angeblich.
Gast
#712932
Der C30 von Microchip = gcc. Sorry die Antworten haben sich überschnitten die Info mit der Schnittstelle waren als Anhang gedacht nicht als Antwort auf die erste Antwort von Andreas Kaiser.
Irgendwie muss ich Ihn doch anlügen um das uneffiziente Datengeschiebe zu vermeiden. cnewbe wrote:
>
> Irgendwie muss ich Ihn doch anlügen um das uneffiziente Datengeschiebe > zu vermeiden. :-) Solange du weist was du tust, ist das auch ok. Die Sache ist die: Wenn du casten musst, dann übernimmst du alleine die Verantwortung dafür, dass das was du schreibst auch korrekt ist. Der Compiler hält sich dann vollständig raus und akzeptiert jede Zuweisung, auch wenn sie noch so falsch ist. Wenn du also weißt, dass dein Speicherlayout deiner Struktur tatsächlich so ist, dass da ein Byte nach dem anderen folgt, dann kannst du das tatsächlich mit dem cast so machen. Wenn du sicherstellen kannst (und genau das macht das packing Attribut), dass das so ist, dann ist nichts gegen den cast einzuwenden. Aber du musst es sicherstellen.
Gast
#713004
Hallo nochmal, danke für die Hilfe jetzt gehts.
Das erste ch lässt sich nicht auf eine ungerade Adresse zwingen. Hab ein Dummybyte eingefügt da sonst der int wert nicht an einer geraden Adresse ist und der Compiler sonst byte zugriffe verwendet(besonders störend bei einem noch dazukommenden long). mfg Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|