PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (s)printf mit double liefert '?'...



Jaecko
06.12.2008, 23:20
Moin.

Und mal wieder ein Problem in C:
Von einem Temperatursensor (DS1629) soll die Temperatur gelesen und angezeigt werden. Idealerweise wird dazu ein Algorithmus nach Datenblatt verwendet, der eine höhere Auflösung als die bei 9 Bit üblichen 0,5°C bietet.
Das Ergebnis muss hier natürlich als double gespeichert werden (irgend ein Integer bringt dann nicht viel).

Problem ist jetzt: Wenn ich versuche, diesen double-Wert per printf oder sprintf auszugeben, dann ist der angezeigte Wert ein Fragezeichen (?).

Also das hier


sprintf(lcdtext, "Temp: %+3.2f", DS1629_GetTempPrecise());

kopft mir in die Variable lcdtext "Temp: ?" rein.

Wo liegt hier der Fehler?

mfG

Felix G
07.12.2008, 00:28
Also wenns float/double sein muss würd ichs erstmal mit dem einfachsten möglichen Formatstring versuchen, also nur %f.


Was ich allerdings nicht verstehe ist, wieso du meinst double verwenden zu müssen?
Eigentlich geht doch immer alles auch mit Festkommazahlen, wenn auch vielleicht nicht ganz so bequem wie mit floats.

sternst
07.12.2008, 06:32
Das Ergebnis muss hier natürlich als double gespeichert werden (irgend ein Integer bringt dann nicht viel).
Das bezweifle ich stark.


Wenn ich versuche, diesen double-Wert per printf oder sprintf auszugeben, dann ist der angezeigte Wert ein Fragezeichen (?).
Da hast du wohl vergessen, dem Linker mitzuteilen, dass er statt der normalen die Floating-Point-Variante von printf dazu linken soll.

Jaecko
07.12.2008, 13:28
Thxle. Kaum sagt man dem Linker das, schon läufts.
Das mit double war noch irgendwie in Erinnerung, dass dieser Typ für unterschiedliche Zahlen mit Nachkommastellen am sinnvollsten sei.

Felix G
07.12.2008, 14:58
Das mit double war noch irgendwie in Erinnerung, dass dieser Typ für unterschiedliche Zahlen mit Nachkommastellen am sinnvollsten sei.kommt drauf an...

float und double sind Fließkommazahlen, die Position des Kommas also variabel. Das ist zwar bequem, da man nichts selbst umrechnen muss, aber dafür ist es auch verdammt langsam auf Controllern die keine FPU (Floating Point Unit) haben.


Prinzipiell kann man aber auch nahezu jede beliebige Berechnung mit Integern durchführen. Die Temperatur muss ja nicht in °C angegeben werden, es spricht doch nichts dagegen stattdessen z.B. 1/1000°C zu verwenden.

Dann entspräche der Wert 1352 der Temperaturvariable eben einer Temperatur von 1,352°C. Das ist bei der Ausgabe auf einem Display zwar umständlicher, aber der Controller kann viel schneller damit rechnen.