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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.