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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.