sprintf(string,"%1.3lf",123.456) avrcc

Gast #933650
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
Angehängte Dateien:
#933669
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).
Gast #933678
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.
#933687
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
Moderator Persönliche Seite #933696
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?
Gast #933710
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 :-(
Angehängte Dateien:
Moderator Persönliche Seite #933725
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).
Gast #933896
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/sprintf.html

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.
Gast #939325
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren