mikrocontroller.net

Forum: Compiler & IDEs sprintf(string,"%1.3lf",123.456) avrcc


Autor: Denis Jakel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe schon etliche Forenbeiträge gelesen, bekomme aber leider keine 
Gleitkommazahl auf mein Display. Als Hardware habe ich das Ethernut 
Board 2.1 mit einem Atmega128. Das Makefile war schon dabei, und ich 
habe folgende Option hinzugefügt:

-Wl,-u,vfprintf -lprintf_flt -lm

Jedoch leider ohne Erfolg!!!  :-(

Ich stelle mal mein c File sowie orginal makefile (Makefile_) und das 
von mir abgeänderte makefile (makefile) hoch.

Wäre für jeden Ratschlag bzw. Tip sehr dankbar.

MfG

Denis Jakel

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was kommt denn raus? Und: wofür steht %lf im Formatstring und was 
übergibst du da...?

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomme nur f angzeigt.
lf steht für long float

Möchte die empfangenen zeichen vom USART als string wandeln und als 
Gleitkommazahl ausgeben.

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
normaler sieht das so aus sprintf(string,"%1.3lf",x)
die 123.456 ist nur zum test ob er float wandeln kann

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
long float? Würde meinen, das gibt's gar nicht. Wo hast Du das her?

Die Ausgabe von Gleitkommawerten (normalerweise double ) geht entweder 
mit f in der "normalen" Darstellung oder mit e in der 
Exponentialdarstellung. Schau mal in die lib-Dokumentation. Da müssten 
eigentlich die Formatkürzel drinstehen. Eine Unterscheidung nach "long" 
bzw. "nicht long" gibt es bei der Ausgabe standardmäßig nirgends (auch 
nicht bei ganzzahligen Werten).

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besser so:
sprintf(string,"%1.3f",123.456)


http://www.cplusplus.com/reference/clibrary/cstdio...

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Gleitkomma-Datentypen unterscheiden sich nur durch ihre Länge
und damit in ihrer Genauigkeit.
Datentyp Länge Vorzeichen Format-String
float 32bit ja %f
double (= long float) 64bit ja %lf, %e, %g
long double 64/80bit(*) ja %lf(*)
Die Datentypen “float“ und “double“ sind auch als „single-precision“ 
bzw.
“double-precision“ bekannt. Man kann sich ungefähr merken, dass “float“
6-7 signifikante Dezimalstellen besitzt, bei “double“ sind es 14-15.

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit %f geht es auch nicht es liegt denke ich am makefile
Habe leider keine Ahnung von Makefiles kann jemand mal meins anschauen 
ob das so stimmt???

Im simple.zip (Makefile)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Eine Unterscheidung nach "long" bzw. "nicht long" gibt es bei der Ausgabe 
>standardmäßig nirgends (auch nicht bei ganzzahligen Werten)
Da habe ich aber schon anderes gelesen:

K&R, Zweite Ausgabe, Seite 147 unten:
...Buchstabe h, wenn short ausgegeben werden soll, oder der Buchstabe l 
wenn das Argument long ist...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:
>>Eine Unterscheidung nach "long" bzw. "nicht long" gibt es bei der Ausgabe
>>standardmäßig nirgends (auch nicht bei ganzzahligen Werten)
> Da habe ich aber schon anderes gelesen:
>
> K&R, Zweite Ausgabe, Seite 147 unten:
> ...Buchstabe h, wenn short ausgegeben werden soll, oder der Buchstabe l
> wenn das Argument long ist...
Hast Recht (hab grad auch noch mal einen Blick in den K&R geworfen). Es 
gibt aber im Standard kein Flag für float , wenn ein l bei einem f 
steht, dann ist das long double ... f steht bereits für double

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ganze hat ja auch schon mal funktioniert auf nem anderen kontroller 
mit AVR Studio kompeiliert

Es liegt sicherlich am Makefile!!!
Was mein ihr zum Makefile???

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>LIBS =  $(LIBDIR)/nutinit.o -lnutos -lnutarch -lnutdev -lnutarch
>                    -lnutcrt -Wl,-u,vfprintf -lprintf_flt -lm $(ADDLIBS)

... -Wl,-u,vfprintf ...
Ich bin ja jetzt nicht so der Crack, aber:
Kommas in der Kommandozeile????

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:

> ...Buchstabe h, wenn short ausgegeben werden soll

Das geht bei Gleitkomma gar nicht.  Da *printf() mit einer variablen
Argumentliste arbeitet, werden Argumente vom Typ float zwangsweise
zu double promotet.  (Achtung: scanf() ist in dieser Hinsicht anders,
denn da werden Zeiger übergeben.)

Der modifier `l' hat bei Gleitkommaformaten laut Standard keine
Wirkung.  Ich bin mir gerade nicht ganz sicher, wie sich die
avr-libc-Implementierung da verhält; ich vermute aber, dass sie das
auch wirklich genau so tut.

Der modifier `L' wäre vom Standard für den Datentyp `long double'
vorgesehen (den kann dein K&R noch nicht kennen, der ist erst mit
ISO C99 in den Standard gekommen); die avr-libc implementiert dieses
jedoch nicht.

Generell ist bei avr-libc (derzeit) sizeof(float) == sizeof(double)
== sizeof(long double) == 4, und die Konstante 123.456 hat den Typ
double.

Hast du denn aber überhaupt die Gleitkommaversion der printf-Bibliothek
gelinkt?

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte diesen Beitrag gelesen

Beitrag "Re: sprintf() Funktion - kleines Problem"

des wegen habe ich habe ich -Wl,-u,vfprintf eigebunden.
Sonst soch nen Plan irgendjemand wegen dem Makefile???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

> Hast du denn aber überhaupt die Gleitkommaversion der printf-Bibliothek
> gelinkt?

Ja, das scheint OK zu sein.

Dann müsstest du mal sagen, was denn genau bei dier passiert.

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Linken wird doch im Makefile mit den Parametern -Wl,-u,vfprintf auf 
leitkommazahl gelinkt, oder???

Und ich denke daran liegt das Problem, das im Makefile etwas nicht 
stimmt..

Autor: Denis Jakel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich gebe euch nochmals den Quellcode da ich ein Teil des Empangs der 
USART auskomentiert habe.

Ich erhalte beim compeilieren keine warnings oder Fehler

Auf dem Display erscheint:

Zeile1 "Messwert"
Zeile2 "f"

Also denke ich das er das Format der Gleitkommazahlen nicht wandelt oder 
nicht wandeln kann :-(

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denis Jakel wrote:

> Ich erhalte beim compeilieren keine warnings oder Fehler

Weil der Compiler zu wenig über die tatsächlich in der Bibliothek
implementierten Details weiß.

> Auf dem Display erscheint:
>
> Zeile1 "Messwert"
> Zeile2 "f"

Dann schmeiß das blöde `l' aus dem Format raus.  Offenbar ignoriert
es die avr-libc doch nicht (kannste gern einen Bugreport dafür
aufmachen), und wie ich oben schon dargelegt habe, ist es so oder
so sinnlos.

Btw.: bitte schreibe alle #includes mit Vorwärtsschrägstrichen, das
macht deinen Code portabler.  Es gibt keinen vernünftigen Grund,
warum man #include <avr\io.h> statt #include <avr/io.h> schreiben
will.  Selbst wenn du den Code nicht auf was anderem als Windows
compilieren willst: sobald du hier Hilfe anforderst, stolperst du
über kurz oder lang halt über Leute wie mich, die den Code nicht
auf Windows compilieren wollen (weil ich keins habe und keins haben
will).

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok habe den code der iclude files mit #includes mit 
Vorwärtsschrägstrichen
trotzdem immer noch das selbe ergebnis... :-( Leider

Autor: Denis Jakel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Neuer C Code für alle Linux Liebhaber

Autor: Denis Jakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat Niemand ne Idee, was da Faul ist???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du denn endlich mal das blöde `l' aus dem Format rausgelassen?

(Sorry, ich habe keine Lust, mir erst das Zipfile zu holen.)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Inzwischen hatte ich mal Zeit, das Zip-File anzugucken.  Ja, das l
ist nicht mehr drin.  Nein, ich kann es in der Simulation nicht
nachvollziehen, wenn ich ein simples sprintf(... "%1.3f") aufrufe,
bekomme ich im Puffer wirklich 123.456.

Blöde Frage, hast du das nach dem Entfernen des "l" auch wirklich
neu geflasht?

Autor: Tobias G, (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin nun auch nicht so der C-Freak, aber macht es nicht einen 
Unterschied ob man "l" oder "L" nimmt?

Wenn man hier nachliest: 
http://www.cplusplus.com/reference/clibrary/cstdio...

sieht man dass:

l --> The argument is interpreted as a long int or unsigned long int for 
integer specifiers

--oder--

L --> The argument is interpreted as a long double

es einen Unterschied macht.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das l ist ja nun auch raus.  Ja, es wäre ein Unterschied gewesen,
das L wird nämlich von der avr-libc auf keinen Fall verstanden,
das l zumindest im Zusammenhang mit integer-Formaten.  (Ich hätte
erwartet, dass es bei Gleitkomma-Formaten einfach ignoriert wird.)

Autor: Denis Jakel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich habe es endlich geschaft die Gleitkommazahl auf dem Display 
auszugeben.

Der Fehler lag darin, dass ich beim Nut/OS Configurator (der die 
Libraries für GCC erstellt) den Haken bei C Runtime(target 
spezific)/File Streams/Floating Point vergessen hatte.

Danke Euch trotzdem Allen für die vielen Postings.

Gruß

Denis

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.