Forum: Mikrocontroller und Digitale Elektronik Problem mit sprintf


von Dietmar (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Problem mit der sprintf Funktion.
Im Einsatz ist das AVR Studio 4.18 / Winavr 20100110 auf Atmega128

Hier ein Auszug aus dem Sourcecode:

int16_t working_value;
char output[40];

sprintf(output,"%4.1f sec.",(double)(working_value/10));

Obwohl das Projekt ohne Warnungen und Fehler durch den Compiler läuft 
wird anstelle einer Kommazahl nur ein Fragezeichen in den string 
"output" geschrieben.
Ich gehe mal davon aus das dem WinAVR irgendwas nicht passt.

Irgenwie stehe ich an der Stelle im Moment auf dem Schlauch. Kann mir 
einer einen Tipp geben wie ich hier weiter komme?
Ein Link zum Lesen würde mir schon reichen.

Gruß und Danke
Dietmar

von Peter (Gast)


Lesenswert?


von Stefan (Gast)


Lesenswert?

Hallo,

hast du gegen die floating point Versionen der *printf funktionen 
gelinkt?
Bin nicht sicher ob dein cast so funktioniert... lass double weg und 
Teil durch 10.0 .

Mal davon abgesehen, dass für die Aufgabe floating point Funktionen zu 
verwenden ein massiver overkill an Speicher und Rechenbedarf ist.

Mach lieber sowas:

sprintf(output,"%4d.%1d sec.",working_value/10,working_value%10);

Beste Grüße,

Stefan

von Klaus W. (mfgkw)


Lesenswert?

ja, wird wohl die falsche Lib sein.
Der (double)-cast sollte nicht das Problem sein.

Dietmar schrieb:
> sprintf(output,"%4.1f sec.",(double)(working_value/10));

evtl. meinst du:
> sprintf(output,"%4.1f sec.",(double)(working_value/10.0));

Ansonsten werden Nachkommastellen abgeschnitten.

Stefan schrieb:
> Mal davon abgesehen, dass für die Aufgabe floating point Funktionen zu
> verwenden ein massiver overkill an Speicher und Rechenbedarf ist.

Welche Aufgabe? Ich kenne sie nicht; vielleicht weisst du mehr?

Wenn man genug Flash hat und Rechenzeit auch kein Problem ist,dann sind 
Gleitkommazahlen und sprintf() durchaus legitim.

Man muß ja keinen Programmieraufwand treiben, um die Flashbelegung
von 10 auf 5% zu drücken.

von Dietmar (Gast)


Lesenswert?

Hallo zusammen,

@Peter: Gesucht hatte ich, aber den Link auf die FAQ nicht gefunden :-(

@All: Es war die falsche Lib. Nachdem ich die Einstellungen aus der FAQ 
übernommen habe läuft das so wie gewünscht.
Mir war nicht bewusst das man die floating point Unterstützung extra 
aktivieren muß. Bin da wohl etwas MS verwöhnt/verdorben.
Ist aber auch erst mein 2. Projekt auf Controller-Ebene.

Danke für die Tips.

Gruß Dietmar

von Stefan (Gast)


Lesenswert?

Hallo,

ich meinte damit, durch 10 zu teilen und es mit einer Stelle nach dem 
Komma auszugeben. Bzw. bei Divisionen durch 10er Potenzen. Das geht mit 
nem Modulo eben einfach schneller, und weniger speicherintensiv.

Nachdem er die doubly im Funktionsaufruf ausrechnet, wird sie wohl 
woanders nicht mehr gebraucht, weshalb ich davon ausgegangen bin, das es 
die einzigste Stelle ist wo er die *printf Funktionen für doubles 
braucht.

Freut mich auf jeden Fall, dass es jetzt geht.

Beste Grüße,

Stefan

von Dietmar (Gast)


Lesenswert?

Hallo Stefan,

im Moment brauche ich den double wirklich nur zur Textausgabe. Da ich 
aber auch noch in anderen Programmteilen analoge Werte verarbeiten und 
ausgeben muß, wäre ich später ebenfalls auf das Problem mit der Lib 
gestoßen.
Es war halt nur 'ne Frage der Zeit.

Da ich eigentlich aus der PC-Welt komme werde ich wohl noch an so 
einigen Stellen über Probleme stolpern, die in Wirklichkeit keine sind.

Also werde ich mich nach dem Motto "learning by doing" mal dadurch 
wühlen.

Gruß Dietmar

von Klaus W. (mfgkw)


Lesenswert?

Dietmar schrieb:
> Also werde ich mich nach dem Motto "learning by doing" mal dadurch
> wühlen.

Wenn man das Tutorial mal mit Verstand liest, macht man viele
Fehler erst gar nicht selbst.

von Dietmar (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Wenn man das Tutorial mal mit Verstand liest, macht man viele
> Fehler erst gar nicht selbst.

Das ist richtig, nur manchmal sind es Kleinigkeiten die man nicht 
richtig verstanden hat und die einem dann Probleme bereiten.
Und bevor man Stunden vor dem Rechner sitzt und nicht weiter kommt ist 
Fragen keine Schande.
Denn: Redenden (schreibenden) Menschen kann geholfen werden, andere 
sterben dumm!

Das Tutorial selbst ist gut gemacht. Mein Wissen über die AVR's habe ich 
genau daher. Ein Buch oder ander Inetseiten habe ich bisher nicht 
benötigt. Ich denke auch das wird in Zukunft auch nicht nötig sein.

Gruß Dietmar

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
Noch kein Account? Hier anmelden.