Forum: Compiler & IDEs struct's mit avr-gcc


von Alexander Starke (Gast)


Lesenswert?

Hallo,

habe mal wieder eine kleine C-Frage, bei dir mir meine Literatur (C-
Das Grundlagen Buch) nicht weiter hilft.

Ich habe eine Struktur wie folgt definiert:

struct motordaten {
  unsigned char nr: 1;
  unsigned char v: 3;
  unsigned char dir: 1;
  unsigned char mod: 2;
};
typedef struct motordaten mdaten;

Das funktioniert soweit auch, nur erfordert es meine Anwendung, dass
ich eine Variable vom Typ mdaten zu einem unsigned char konvertieren
möchte.

mdaten testvariable;
unsigned char anderevariable;
anderevariable = (unsigned char) testvariable;

Hierbei bringt mir avr-gcc allerdings nur Fehlermeldungen. Eigentlich
sollten ja beide Variablen 1 Byte groß sein ?!

Alex

von Alexander Starke (Gast)


Lesenswert?

Hat keiner eine Idee?
Das Problem ist, dass die Motorsteuerung über das SPI erfolgen soll und
es praktischer ist, alle 4 Parameter mit einer 8Bit Variablen zu
übergeben, anstatt extra 4 Byte zu senden.
Eigentlich legt doch die Deklaration einer Variablen lediglich fest,
wie eine Variable zu interpretieren ist. Da meine neu definierter
Datentyp die gleiche Größe (?) wie ein unsigned char hat, sollte doch
eine Hin- und auf Empfängerseite Rückkonvertierung kein Problem sein.
Habe ich eventuell Syntaxfehler oder ein generelles
Verständnisproblem?

Alex

von Jörg Wunsch (Gast)


Lesenswert?

Ja, Du hast ein generelles Verständnisproblem.  Auch wenn's ein
Bitfeld ist, es bleibt eine Struktur, und die kann man nicht einfach
auf einen Skalarwert casten.

union ist das Stichwort.  Den Rest findest Du in jedem C-Buch.

von Daniel Jelkmann (Gast)


Lesenswert?

Hi!

Ich glaube, das was Du vor hast, das funktioniert so direkt nicht.
Du kannst eine struct nicht einfach auf einen einfachen Datentyp wie
int konvertieren.

Was aber gehen müsste: Du brauchst einen Zeiger auf einen unsigned
char, und diesen lässt Du auf die Adresse der struct zeigen.
mdaten testvariable;
unsigned char * andereVariable = (unsigned char*)&testvariable;
Mit diesem Zeiger kannst Du nun direkt auf das Byte zugreifen.
Ich weiss nicht genau was Du hiermit machen willst, aber Du solltest
beachten, dass die Anordnung der einzelnen Bits nicht in der
Sprachdefinition festgelegt ist und jeder Compiler die einzelnen Bits
anders anordnen kann, also in Deinem Fall liegt das Bit "nr"
vielleicht mal ganz vorne im Byte, vielleicht aber auch ganz hinten...

Daher wäre es vielleicht sicherer, "von Hand" aus der struct ein Byte
zu machen. Also in etwa so:
unsigned char andereVariable = (testvariable.nr << 6) | (testvariable.v
<< 3) | (testvariable.dir << 2) | (testvariable.mod);
Dann weisst Du wenigstens sicher, was an welcher Stelle im Byte steht,
unabhänging vom verwendten Compiler.

Bye
 Daniel

von Daniel Jelkmann (Gast)


Lesenswert?

hmm, die Idee mit der Union von Jörg ist natürlich noch besser...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.