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.
"%1.3E" passt irgendwie nicht zu float http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html
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?
1. vermutlich nicht mit den float-Libs gelinkt 2. den Rückgabewert von sprintf ignoriert 3. vergessen, mal den Inhalt des Buffer anzuschauen
>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.
>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.
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.
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).
@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?
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.