Forum: Compiler & IDEs Wie Float/Double-Zahl in String konvertieren


von Visitor (Gast)


Lesenswert?

Hallo,

ich möchte eine Float- bzw. Double-Zahl in einen String konvertieren:

#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>

volatile double FlagFloat1, FlagFloat2;

int main(void)
{
  char Buffer[20] = {0};
  FlagFloat1 = 1.23E-10;               //Umzuwandelnde Zahl
  sprintf(Buffer, "%1.3E", FlagFloat1);
  FlagFloat2 = atof(Buffer);          //String zur Kontrolle wieder
                                      //zurück  konvertieren
  while(1)
       asm volatile ("nop");
  return 0;
}

Im Simulator (AVR-Studio Ver 4.19 Build 730) wird für FlagFloat2 immer 0 
angezeigt.
Was mache ich falsch, bzw. gibt es eine andere Möglichkeit der 
Umwandlung.

von Peter II (Gast)


Lesenswert?


von Peter II (Gast)


Lesenswert?

Peter II schrieb:
> passt irgendwie nicht zu float
>
> http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html

sorry hatte mich geirrt.

was steht denn im Buffer drin?

von Klaus W. (mfgkw)


Lesenswert?

1. vermutlich nicht mit den float-Libs gelinkt
2. den Rückgabewert von sprintf ignoriert
3. vergessen, mal den Inhalt des Buffer anzuschauen

von Visitor (Gast)


Lesenswert?

>was steht denn im Buffer drin?

Buffer[0] = 63

Der Rest ist mit 0 belegt.

Wenn ich das Programm auf dem PC unter MSVisualC++ ausführe, 
funktioniert alles wie gewüscht.

von Visitor (Gast)


Lesenswert?

>1.vermutlich nicht mit den float-Libs gelinkt

Die Compilierung erfolgt ohne Fehlermeldung. Die include-Libs habe ich 
angegeben. Welche Libs würden denn fehlen ?

>2. den Rückgabewert von sprintf ignoriert

Der Rückgabewert enthält die Anzahl der Bytes in Buffer und ist für die 
Konvertierung m.E. ohne Bedeutung. Außer als Kontrolle natürlich

>3. vergessen, mal den Inhalt des Buffer anzuschauen

s.o.

von Klaus W. (mfgkw)


Lesenswert?

Visitor schrieb:
> Die Compilierung erfolgt ohne Fehlermeldung. Die include-Libs habe ich
> angegeben. Welche Libs würden denn fehlen ?

Nicht fehlen, nur evtl. die falsche.
Von der AVR-libc gibt es eine kleinere Variante, die für Programme ohne 
Gleitkommazahlen gedacht ist und in der printf() entsprechend bei den 
Direktiven für Gleitkommazahlen einfach ein Fragezeichen ausgibt 
(ASCII-Wert=63, ach!), und eine vollständige, die auch mit 
Gleitkommazahlen umgehen kann.

von Klaus W. (mfgkw)


Lesenswert?

PS:
mit #include fügt man keine Libs ein (für den Linker), sondern nur 
header-Dateien für den Compiler - zwei verschiedene Dinge, auch wenn sie 
manchmal paarweise zusammen gemacht werden müssen (passende lib für 
einen bestimmten Header).

von Visitor (Gast)


Lesenswert?

@Klaus Wachtler,

ich bin jetzt nicht so der absolute C-Profi.

Wärst du so freundlich, das Programm hinsichtlich der erforderlichen 
Libs und Header-Dateien  zu ergänzen, damit es funktioniert?

von Klaus W. (mfgkw)


Lesenswert?

Das hat nichts mit deinem Quelltext zu tun, sondern hängt davon ab, wie 
du kompilierst und linkst.

Falls AVR-Studio (das ich nicht nehme und dehalb nicht viel dazu sagen 
kann): es sollte hier beschrieben sein: 
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_bei_WinAVR_bzw_AVR-Studion

Falls mit einem der üblichen Makefiles, die hier so herumgeistern: das 
wird wahrscheinlich im Makefile irgendwo vorbereitet sein, so daß man 
die eine Variante auskommentiert und dafür eine andere aktiviert.
Z.B.:
1
...
2
# Minimalistic printf version
3
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
4
5
# Floating point printf version (requires MATH_LIB = -lm below)
6
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
7
8
#PRINTF_LIB = 
9
#PRINTF_LIB = $(PRINTF_LIB_MIN)
10
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
11
...

Falls von Hand: entsprechend mit  ... -lprintf_flt... kompilieren und 
linken statt ... -lprintf_min....

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

PPS: Ich habe irgendwie noch im Kopf, daß es nötig ist, bei 
Gleitkommazahlen auf dem AVR auch #include <math.h> im Quelltext zu 
haben, bin mir aber nicht mehr sicher - notfalls probieren.

von Visitor (Gast)


Lesenswert?

Vielen Dank an Klaus. Mein Problem wird in den FAQ unter dem Punkt

"Aktivieren der Floating Point Version von sprintf bei WinAVR bzw 
AVR-Studio"

gelöst.

von Gcc (Gast)


Lesenswert?

Wie wäre es denn mit dtostrf?

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.