Hallo fredyxx,

Zitat von
fredyxx
Ja, prima Idee. Aber was bewirkt das float in Klammern gegenüber nur return 0.0??
Hier eigentlich nichts 
Es war davor aber die Diskussion, dass je nach verwendeter Hardware, der Compiler float oder double verwendet.
Mit einem typecast kann man dem Compiler dazu bringen einen bestimmten Datentyp zu verwenden, bzw. kann verhindern, dass interne Konvertierungen vorgenommen werden.
Ein schlechter Compiler mit double, würde die 0.0 zuerst als double erzeugen und dann in einen float umwandeln. Mit "(float) 0.0" wird er gezwungen 0.0 gleich als float zu erzeugen.
Es gibt manchmal Fälle, wo man aus Sicht des Compilers etwas "murksen" muss und dann meckert der Compiler rum.
z.B. sind Ports typischerweise 8-Bit breit:
Code:
uint8_t port;
int i;
i &= 0xFF; // i hat jetzt garantiert nur noch 8 gültige Bits
port = i; // hier motz der Compiler, weil int mehr als 8 Bits hat und Daten verloren gehen könnten
// wir haben aber im Programm sicher gestellt, dass nur noch 8 Bit vorhanden sind
port = (uint8_t)i; // hier motzt der Compiler nicht mehr.
Ein anderes Beispiel:
Code:
int i;
i = i * 3.3; // das geht nicht
// der Compiler wandelt i zuerst in einen double um und multipliziert dann mit 3.3
// das Resultat ist dann aber auch double und passt nicht in einen int
i = (int) (i * 3.3); // dies funktioniert und es ist auch dokumentiert, dass bewusst die Nachkommastellen abgeschnitten werden.
Das mit den Typenkonvertierung ist aber immer eine heisse Kiste und man muss sich genau überlegen was man da tut. Nur weil der Compiler nicht motzt, funktioniert der Code noch lange nicht.
Auch muss man bedenken, welchen Wertbereich ein Datentyp abbilden kann und welche Konvertierungen der Compiler automatisch macht
Code:
volatile uint8_t c;
c = c * 255;
c = c / 256; // liefert immer 0!
c = (c * 255) / 256; // hier bekommst du das erwartete Resultat
Im ersten Fall wird das Zwischenresultat auf 8 Bit gekürzt, erzeugt für alle Werte von c >1 einen Überlauf
Aber das ist egal, weil ein 8-Bit Wert geteilt durch 256 immer 0 ergibt.
Im zweiten Fall ist das Zwischenresultat ein Long und es wird kein Überlauf erzeugt.
"volatile" sagt dem Compiler, dass c sich ausserhalb des Kontext verändern kann. Das habe ich hier verwendet damit der Compiler nicht optimieren kann und das erste Beispiel dann trotzdem funktioniert!
Wegen solche "Details sind schon Raketen explodiert.
Hier die Kurzversion: https://de.wikipedia.org/wiki/Ariane_V88#Fehlerursachen
Und noch der ausführliche Bericht: http://www4.in.tum.de/lehre/seminare...g-27-11-02.pdf
MfG Peter(TOO)
Lesezeichen