ich baue mir gerade für die ATmegaAVR0 Reihe eine Usart Lib nach. Um nicht ständig mit putc, puts, ltoa und deren Verwandten im Code handieren zu müssen habe ich die Arduino print Methoden nachgebaut. Das funktioniert soweit bis auf die letzte Testzeile wo ich einen Floatwert 1.999 direkt übergebe. Hierfür findet der Compiler komischerweise keine passende print Signatur. Was mache ich falsch?
Fehlermeldung: “call of overloaded ‘print(double)’ is ambiguous”
Um Missverständisse vorzubeugen. Der Code läuft so nicht in der Arduino IDE. Ich mache das “zwangsweise” in Atmel Studio ohne Arduino Framework. Bei Bedarf/Notwendigkeit kann ich euch das Codepaket für AS7 geben.
Man sollte für seine Hardware eine Klasse von Print [Nachtrag: oder besser gleich von Stream] ableiten und muss dann dort nur die virtuelle Methode size_t write(byte);
hardwarespezifisch implementieren, und kriegt so die ganze print - Funktionalität geschenkt.
Fehlermeldung: “call of overloaded ‘print(double)’ is ambiguous”
In der Regel nennt der Kompiler die möglichen Kandidaten.
Kann sein, dass dich das nicht interessiert.
Aber darin steckt ein/der Hinweis auf die Lösung.
@ Micha:
Von Arduino kann ich leider nichts verwenden. Ein paar Dinge habe ich mir abgeschaut. Hintergrund ist der das ich einen ATmega4809 komplett verwenden möchte. Das Arduino Nano Every Board hat leider nicht alle Pins rausgeführt. Vor mir liegt ein Microchip ATmega4809 Curiosity Nano Board. Das als Nebeninfo. Vielleicht kann man das später für eine Boarderweiterung für die Arduino IDE verwenden. Das weiß ich jetzt noch nicht. Ich muss erstmal so zurecht kommen.
@ Serenifly:
Wie meinst du das mit Default Nachkommastellen? Defaultmäßig gebe ich 2 Kommastellen aus wenn kein Parameter dafür übergeben wurde. Dafür sind die zwei print "float Signaturen" gedacht.
@ combie:
Die Einzigste Fehlermeldung die ich bekomme war die gezeigte Fehlermeldung: "call of overloaded 'print(double)' is ambiguous". Diese zeigt auf die Codezeile:
usart1.print(1.999); usart1.putChar('\n'); // findet keine print Signatur
Mehr Informationen gibt mir AS bzw. der Compiler nicht. Option -v ist aktiv.
Ich für meinen Teil sehe zwei saubere print Methoden für Datentyp float. Mit einem und zwei Parametern. Sollten saubere unterscheidbare Signaturen sein. Macht er mit der Testvariablen f anstandslos. Irgendwie kann er aus der Direktangabe 1.999 keinen float Datentyp erkennen, so scheint mir?
Vielen Dank. Habe die Parameter der print float Signatur in double geändert und schon klappt es.
Ist irgendwie sehr empfindlich was float vs. double angeht.
Ich dachte bis jetzt float und double sind beides float Datentypen nur das double genauer ist.
eine Frage bleibt noch offen. Warum ist 1.999 ein double und kein float?
Für mich wäre von der Genauigkeit her float eine Art "Teilmenge" von double.
1.999 kann float oder double sein in meinen Augen. Nur das double auf unseren µC gleich float ist.
Warum - Fragen sind traditionell schwierig. Ist eben so!
Guck hier bei Suffix: 1.0 ist double, 1.0F ist singleprecision float. Und dann gibt's noch L für einen long double.
Warum der Compiler so pingelig ist, wenn er ein float erwartet und du ihm ein double gibst, wäre die nächste warum-Frage. Und das bei Konstanten, die der Compiler leicht wandeln kann.
Und warum das umgekehrt ( signatur sagt double, er kriegt ein float ) egal ist. (Ist das so?)
Fließkomma Konstanten sind per default double.
Denn auf den meisten Systemen ist double das Format, auf dem die FP Units moderner Prozessoren getrimmt sind. Schnell und genau.
Teilweise können die das gar nicht, was wir als float kennen.
Der Wertebereich von Float ist (außer auf AVR) kleiner als von Double, darum kann der implizite Cast nur in eine Richtung führen.