Struct C30(PIC)

Gast #712890
Lesenswert?
• ▲
▼
Hallo,
ich möchte eine struct folgend benutzen:
1
struct {
2
    char ch;
3
    int i;
4
    char ch2;
5
}daten;
6

7
char *ptr = (char*)&daten;
8

9
daten.i = 1000;
10
//usw OK
11
for(....)
12
{
13
*ptr++=wertX;
14
}
nun hab ich das Problem das der C30 Compiler die 2 chars auf int 
auffüllt.
Wie kann man sowas umgehen?
Gast #712903
Lesenswert?
• ▲
▼
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
#712908
Lesenswert?
• ▲
▼
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.
#712917
Lesenswert?
• ▲
▼
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.
#712924
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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.
1
Die oberste Compiler-Direktive beachten, die da lautet:
2
Du sollst deinen Compiler nicht anlügen!
Irgendwie muss ich Ihn doch anlügen um das uneffiziente Datengeschiebe 
zu vermeiden.
#712941
Lesenswert?
• ▲
▼
cnewbe wrote:
>
1
> Die oberste Compiler-Direktive beachten, die da lautet:
2
> Du sollst deinen Compiler nicht anlügen!
3
>
> 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
Lesenswert?
• ▲
▼
Hallo nochmal,
danke für die Hilfe jetzt gehts.
1
struct {
2
    char ch;
3
    int i __attribute__((packed));
4
    char ch2 __attribute__((packed));
5
}daten;
6
//oder
7
struct {
8
    char dummy __attribute__((aligned));
9
    char ch;
10
    int i __attribute__((packed));
11
    char ch2 __attribute__((packed));
12
}daten;
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 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