float in uint8_t mit dem GCC

Gast #3418333
Lesenswert?

Hallo.

Wenn ich eine float Variable mit dem AVR Studio in ein uint8_t caste und 
dann zu einer uint8_t Variable zuweise, ist das soweit okay?
Runden muß nicht zwingend passen - Die Kommastellen brauche ich an einer 
anderen Position.

float calc_wert;
uint8_t reglerwert;
reglerwert = (uint8_t)calc_wert;

Grüße!
Gast #3418348
Lesenswert?

@majormoritz: Stimmt. Das könnte ich noch nutzen.

@Joachim K.: Zwei Nachkommastellen würden reichen. Ja, auf Festkomma 
kann ich noch umstellen - das wäre auch einiges flotter.

Aber grundsätzlich würde es okay sein mit dem einfachen casten oder?
#3418403
Lesenswert?

Ja, ist sogar besser als impliziter cast. Den schluckt der Compiler u.U. 
ohne irgendwas anzumeckern und wenn irgendwas dann komisch oder falsch 
funktioniert, man hat mal wieder einen Fehler, der schwer zu finden ist.
Für geeigneten Zahlenbereich musst natürlich du sorgen :)

PS: C++ hat da zwei verschiedene casts: Typkonversion oder einfach 
Bitmuster umfüllen. Letzteres bekommt man in C z.B. mit einer Union. 
Damit wirds dann auch maschinenabhängig...
Gast #3418484
Lesenswert?

(typeof(reglerwert)) ist cool :)
Das muß ich mir mal angewöhnen.

Warum ich aber fragte, ich mache AD-Wandlungen und bekomme im Startmodi 
plötzlich und unerwartet statt einem 1023er ADCw eine 532 raus.
OBWOHL im ADC-Register nach dem 532 schreiben eine 1023 drin steht.
Wenn ich aber die Zeile mit dem casting lösche, der natürlich in einem 
ganz anderen ADC-Kanal steht, funktioniert alles tadellos.

Wenn ich z.B. schreibe:
1
ADCwert = ADC;
2
if(ADCwert == 532)
3
{
4
ADCwert = ADC;
5
}

Und mache ein Brekpoint auf den inneren "=ADC", dann kann ich mit 
Einzelstep plötzlich den falsch gezogenen 532 Wert mit 1023 ersetzen.
Im freien Lauf funktioniert das aber nicht.

Ich komme dem blöden Fehler einfach nicht hinterher :(

Überschreiben von Variablen im Mamory habe ich schon gecheckt.
Vorne und hinten dran rührt sich nichts wenn die 532 plötzlich in der 
Variable steht...
Gast #3418503
Lesenswert?

Matthias schrieb:
> (typeof(reglerwert)) ist cool :)
> Das muß ich mir mal angewöhnen.

Das ist aber eine Nonstandard-Erweiterung vom GCC. Besser ist "decltype" 
das seit C++11 Standard ist.

Joachim K. schrieb:
> Bitmuster umfüllen. Letzteres bekommt man in C z.B. mit einer Union.
Oder durch einen Pointer-Cast:
1
*((uint8_t*) &myFloat)
In C++ dann schöner mit:
1
reinterpret_cast<uint8_t&>(myFloat)
Gast #3418603
Lesenswert?

Hallo.

Bin immer noch an der Sache dran obwohl ich heute Urkaub hätte und jetzt 
schon wieder viiiieeel zu spät ist.
Ich habe es nun im neuesten Atmel Studio integriert und der Fehler ist 
weg.
Kann Euch den Code leider nicht hoch laden, da es ein Firmenprojekt mit 
einigen tausend Zeilen ist.
Dann kann ich meinen Urlaub auch gleich verlängern ;)

Habe jetzt schon drei Stunden die Zeile gesucht und versucht dem Ganzen 
aus dem Weg zu gehen.
Mehr Zeit kann ich nicht mehr daran hängen, sorry.

Auf jeden Fall gehts im aktuellen Studio.

Danke!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren