Was bitte sollen wir denn wie testen?
Sorry, mit einem nicht compilierbaren Schnipsel kann ich leider
nix anfangen.
Ansonsten das Übliche: in 99 % der Fälle sitzt der Bug vor
dem Rechner...
Hallo Jörg,
du wirst doch wohl die Möglichkeit haben, einen String den du mit
sprintf produziert hast, auf irgendein Medium (LCD o.ä.)auszugeben!
73 Peter,DF8XA
Selbst wenn er kein Gleitkomma-printf hat, sollte nicht nur
Schrott herauskommen. Lediglich das %f wird dann in ein
(einzelnes) Fragezeichen gewandelt.
Danke Matthias. Ja, es lag an der nicht eingebundenen float-Library.
Blöd ist, dass keine Fehlermeldung oder wenigstens eine Warnung beim
compilieren generiert wird. Das sich dabei das Programm von 588 Byte
auf 4632 Byte aufbläht liegt wahrscheinlich daran, dass der Linker die
komplette stdio-Library mit einbindet und nicht nur die für die sprintf
benötigten Funktionen.
@Jörg: Das '?' sieht man aber nur, wenn man ein einzelnes %f in der
Formatanweisung hat. Wenn zusätzlich ein string (%s) und ein char (%c)
in der Formatanweisung stehen, sieht man einfach nur "Müll" auf dem
Monitor und da kannst du dann lange nach deinem einzelnen Fragezeichen
suchen. Andererseits, wenn dich solche Fragen nerven, dann Antworte
doch einfach nicht. Deine Bemerkung, dass bei dir alles funktioniert
bringt niemanden weiter. Das du ja ein "ganz Toller" bist, ist mir
durch deine zahlreichen Beispiele im Umgang mit "Unwissenden" in
diesem Forum längst bekannt. Du solltest besser dein Rufzeichen
weglassen sonst denken die Leute noch alle Funkamateure sind so
"aufgeblasene Besserwisser".
Nochmals danke Matthias
Peter, DF8XA
> Blöd ist, dass keine Fehlermeldung oder wenigstens eine Warnung beim> compilieren generiert wird.
Geht leider nicht, da der Compiler nicht weiß, gegen welche Library du
linkst, der Linker aber keine Chance mehr hat, alle Formatstrings zu
überprüfen, ob da nun irgendwo ein Gleitkomma-Format verlangt worden
ist.
> Das sich dabei das Programm von 588 Byte auf 4632 Byte aufbläht> liegt wahrscheinlich daran, dass der Linker die komplette> stdio-Library mit einbindet und nicht nur die für die sprintf> benötigten Funktionen.
Der Linker linkt nur dazu, was gebraucht wird. Gleitkommarechnung auf
einem 8-Bit-Micro kostet halt richtig. Da noch dazu printf() immer
den Code für alle möglichen Formate vorhalten muss, bezahlst du ja
auch für andere Dinge wie 32-Bit-Integerzahlen, selbst wenn du sie
nicht benutzt.
> Das '?' sieht man aber nur, wenn man ein einzelnes %f in der> Formatanweisung hat. Wenn zusätzlich ein string (%s) und ein char> (%c) in der Formatanweisung stehen, sieht man einfach nur "Müll"
auf
> dem Monitor ...
Dann ist da noch was anderes foul. Wenn alles Andere bei dir korrekt
eingestellt ist (Taktfrequenz, Baudrate etc.), dann hätte mit
Gleitkommavariante geschrieben werden sollen (z. B., Rundungsfehler
erfinde ich mal schnell frei):
sprintf = 134.430951 1 string <CR>
und mit der Standardversion
sprintf = ? 1 string <CR>
Wenn das bei dir anders war, hast du noch ein weiteres Problem.
> Deine Bemerkung, dass bei dir alles funktioniert bringt niemanden> weiter.
Deine ungenügende Fehlerbeschreibung allerdings auch nicht.
@Jörg
> und mit der Standardversion> sprintf = ? 1 string <CR>> Wenn das bei dir anders war, hast du noch ein weiteres Problem.
Wenn ich mich recht erinnere, war es bei mir auch so, daß nach einem
"%f" ohne float-printf nur noch Unsinn ausgegeben wurde. (Nicht die
letzte avr-lib,)
In diesem(!) Punkt stimme ich Peter zu.
Ich werde das morgen nochmal testen und berichten.
73,
Falk
Hab's eben selbst nochmal ausprobiert.
Ja, mir fällt's jetzt wie Schuppen aus den Haaren... :-)
Das %f wird ja komplett ignoriert, d. h. der Gleitkommawert wird
nicht vom Stack geholt und damit anschließend als char (durch %c)
interpretiert. Vermutlich habe ich bei derartigen Tests nur ein
%i oder sowas danach gehabt, da wird dann einfach irgendeine Zahl
ausgegeben.
Ich halte das für einen Bug. Bitte schreibt mal einen Bugreport:
https://savannah.nongnu.org/bugs/?group=avr-libc
Sorry nochmal.
Hallochen
Gibt es eine konstruktive Lösung ?
Habe das gleiche Problem.
Mit
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main (void) {
char[10] buffer = "leer";
float MyFloat = 123.45;
if (MyFloat == 123.45) sprintf(buffer, "% #3.2f", MyFloat);
}
erhalte ich nur ein Fragezeichen im buffer.
Was muss ich also tun, damit im buffer "123.45" steht ?
Viele Grüsse
Daniel
Tja, das nützt alles nichts.
Habe alle Options ausprobiert, die da beschrieben sind.
Immer nur Fragezeichen.
Die Lösung habe ich anderswo gefunden:
// sprintf(buffer,"% #3.2f",MyFloat); // DOESN'T WORK --> "?"
dtostrf(MyFloat,7,2,buffer);
Das arbeitet perfekt.
Aber besten Dank ...
Daniel