www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit sprintf


Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.