Struct C30(PIC)

Gast #712890
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
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
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
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
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.
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
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

Eine eigene Frage? Dieser Thread ist über 18 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.