float in uint8_t mit dem GCC

Gast #3418333
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
@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
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...
#3418444
Josef D. schrieb:
> Halte ich für eine gewagte These.

Ich auch. calc_wert soll doch später mal ein int werden, nicht der 
Reglerwert...

Die beste Methode wäre an der Stelle einen Kommentar zu setzen, dass da 
ein TODO ist, um das man sich bei Festkommaarithmetik kümmern muss. 
Auch, um vielleicht festzustellen, dass rein garnichts zu tun ist :D
Gast #3418484
(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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.