Hallo ich bin noch relative neu in der C programmierung. Also bitte ich um nachsehen für meine Unwissenheit. Ich habe ein Bitfeld nun ein Wert entspricht 2 bit in meinem Bitfeld. Nun caste ich diesen Wert in einen uint8. Jetzt meine Frage kann es irgend wie passieren das auch mal ein Wert größer als 3 (2 Bit max) in meiner uint8 Varibalen steht?
1 | #define GetSensLevelRq(variable) ((variable).Sens1_Rq)
|
2 | |
3 | ist ein Makro wie ich die auf die einzelnen Felder des Bitfeld's zugreife. |
4 | |
5 | uint8 Sens1Value |
6 | Sens1Value = (uint8)(GetSensLevelRq(SENS_RQ)); |
7 | |
8 | if(Sens1Value > 2) |
9 | {
|
10 | |
11 | // hier kommen dann Fehlerbehandlung
|
12 | |
13 | }
|
lowlevel schrieb : Wie "castest" du denn? dynamic, static Entschuldige was meinst Du damit? soweit reicht meine Erfahrung noch nicht.
C_Dummy schrieb: > Jetzt meine Frage kann es irgend wie passieren das auch mal ein > Wert größer als 3 (2 Bit max) in meiner uint8 Varibalen steht? Nein, kann nicht sein. Bitfelder sind ja im Grunde auch nichts anderes, als das du dem Compiler die Aufgabe der Ausmaskierung und Zurechtschieberei überträgst. Der Compiler kann auch nichts anderes tun, als das was du händisch machen würdest, wenn du Einzelbits bearbeitest.
Karl Heinz Buchegger schrieb: > Nein, kann nicht sein. aber die anderen Bits habe ja keine Verwendung, steht es dem compieler dann nicht frei ob sie 1 oder 0 sind? Bei einem Cast würde sie dann aber übernommen werden.
Peter II schrieb: > Karl Heinz Buchegger schrieb: >> Nein, kann nicht sein. > > aber die anderen Bits habe ja keine Verwendung, steht es dem compieler > dann nicht frei ob sie 1 oder 0 sind? Bei einem Cast würde sie dann aber > übernommen werden. Natürlich steht es dem Compiler frei diese Bits zu belegen wie er möchte. Er muss aber im Moment des Zugriffes auf den uint8 sicherstellen, dass der richtige Wert da steht. Das tut auch jeder Compiler, ansonsten ist kein Programm lauffähig und der Compiler wäre Schrott ^^
Peter II schrieb: > Karl Heinz Buchegger schrieb: >> Nein, kann nicht sein. > > aber die anderen Bits habe ja keine Verwendung, steht es dem compieler > dann nicht frei ob sie 1 oder 0 sind? Bei einem Cast würde sie dann aber > übernommen werden. Der Cast kommt ja erst, nachdem der COmpiler bereits die beiden Bits extrahiert hat. Von den restlichen Bits, die du im Original hast, bleibt im Zuge dessen nichts übrig. Und es fragt sich, wozu er da überhaupt casten will. Viele Probleme wären erst gar nicht entstanden, wenn die Programmierer einen Cast nicht als Kavaliersdelikt auffassen würden. Wer exzessiv Casten MUSS (also wirklich muss, und nicht einfach nur einen Cast reinmacht weil gerade schönes Wetter ist), der sollte sich mal seine benutzten Datentypen genauer ansehen. Casts sind die Ausnahme und nicht die Regel.
Mal so nebenbei: Wozu das Makro? Wozu der Cast? Sieht dir
1 | Sens1Value = SENS_RQ.Sens1_Rq; |
irgendwie zu "primitiv" aus?
Stefan Ernst schrieb: > Mal so nebenbei: > Wozu das Makro? Wozu der Cast? > Sieht dir >
1 | Sens1Value = SENS_RQ.Sens1_Rq; |
> irgendwie zu "primitiv" aus?
:-)
Es war schwierig zu schreiben, also solls auch schwierig zu lesen sein!
Wo kommen wir denn da hin, wenn jeder beim Codelesen sofort verstehen
würde, was abgeht.
Karl Heinz Buchegger schrieb: > C_Dummy schrieb: > >> Jetzt meine Frage kann es irgend wie passieren das auch mal ein >> Wert größer als 3 (2 Bit max) in meiner uint8 Varibalen steht? > > Nein, kann nicht sein.
1 | #include <stdint.h> |
2 | |
3 | struct s { char a : 2; } s; |
4 | |
5 | uint8_t geta (void) |
6 | {
|
7 | return (uint8_t) s.a; |
8 | }
|
geta kann zB 255 liefern.
Johann L. schrieb: > #include <stdint.h> > > struct s { char a : 2; } s; > > uint8_t geta (void) > { > return (uint8_t) s.a; > } > geta kann zB 255 liefern. Ist ja auch Lötzinn.
1 | #include <stdint.h> |
2 | |
3 | struct s { unsigned char a : 2; } s; |
4 | |
5 | uint8_t geta (void) |
6 | {
|
7 | return s.a; |
8 | }
|
Jetzt passiert es nicht mehr. Und wenn du jetzt noch erklärst warum, hast Du C ein bischen mehr verstanden. Volker
Volker Zabe schrieb: > Und wenn du jetzt noch erklärst warum, hast Du C ein bischen mehr > verstanden. Ich hoffe du meinst nicht Johann sondern den TO mit dieser Aussage :-) Denn Johann versteht von C mit Sicherheit mehr als 99% der hier Anwesenden. Und er hatte Recht: Ich hab bei meiner Aussage eine Annahme getroffen, die der TO nicht erwähnt hat - dass er die Definition des Bitfeldes sinnvoll gemacht hat.
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.