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!
Die Nachkommastellen werden aber nur abgeschnitten. Evtl. Zum runden +0.5. Moritz
Matthias schrieb: > Die Kommastellen brauche ich an einer > anderen Position. wieviele Kommastellen? schon mal daran gedacht, Festkommaarithmetik zu verwenden?
@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?
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...
:
Bearbeitet durch User
Joachim K. schrieb: > Ja, ist sogar besser als impliziter cast. Halte ich für eine gewagte These. Wenn schon, dann besser so: reglerwert = (typeof(reglerwert))calc_wert; Sonst bleibt der cast vielleicht versehentlich so stehen, wenn man den Typ von reglerwert ändert.
:
Bearbeitet durch User
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
(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...
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) |
Matthias schrieb: . > Wenn ich aber die Zeile mit dem casting lösche, der natürlich in einem > ganz anderen ADC-Kanal steht, funktioniert alles tadellos. Zeig mal den Code. Mit dem Cast an sich hat das nichts zu tun. Da läuft irgendwas anderes falsch.
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!
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.