Forum: Compiler & IDEs Cast Problem


von C_Dummy (Gast)


Lesenswert?

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?

von Bronco (Gast)


Lesenswert?

Code Beispiel?

von C_Dummy (Gast)


Lesenswert?

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
}

von lowlevel (Gast)


Lesenswert?

Wie ist denn variable definiert. Wie "castest" du denn? dynamic, 
static...

von C_Dummy (Gast)


Lesenswert?

lowlevel schrieb : Wie "castest" du denn? dynamic, static
Entschuldige was meinst Du damit? soweit reicht meine Erfahrung noch 
nicht.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Xavier Lander (Gast)


Lesenswert?

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 ^^

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

Mal so nebenbei:
Wozu das Makro? Wozu der Cast?
Sieht dir
1
Sens1Value = SENS_RQ.Sens1_Rq;
irgendwie zu "primitiv" aus?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Volker Z. (vza)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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