2016-08-25 14 views
4

Ich programmiere auf einem AVR XMEGA Mikrocontroller mit AtmelStudio.String in Gleitkomma umwandeln

Ich habe Probleme beim Konvertieren einer Zeichenfolge in einen Float. Die Zeichenfolge wird token2 genannt und hat den Wert "8.604165"

Ich habe schon ein paar Funktionen versucht:

  • float lon = atof(token2); printf("lon=%f", lon); kehrt lon=?
  • float lon = strtod(token2, NULL); printf("lon=%f", lon); kehrt lon=?
  • float lon = strtof(token2, NULL); printf("lon=%f", lon); gibt einen Fehler undefined reference to strtof, sogar einschließlich <stdlib.h>

Mache ich etwas falsch?

+0

Ihr Code kann in Ordnung sein: [siehe dieses Beispiel] (http://ideone.com/azrwwH) – LPs

+4

Bitte veröffentlichen Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/) mcve). Schreibst du Code für Mikrocontroller? Wenn ja, geben Sie bitte die Umgebung an. Könnte verwandt sein: [c - Arduino: printf/fprintf druckt Fragezeichen statt Float - Stack Overflow] (http://stackoverflow.com/questions/14146850/arduino-printf-fprintf-prints-question-mark-instead-of -float) – MikeCAT

+0

Ja @MikeCAT. Ich programmiere auf einem AVR XMega-Mikrocontroller –

Antwort

0

Ok, also ist das etwas von Mikrocontrollern.

Ähnlich wie @Sneftel sagte, ich musste nur die Bibliotheken libprintf_flt.a und libm.a in AtmelStudio hinzufügen.

+3

Es ist nicht nur spezifisch für diese IDE, dieser Ansatz ist ziemlich üblich bei kleineren Mikrocontrollern, da die Verarbeitung von Floats Ihrer Code-Größe für platzbeschränkte Geräte ein wenig Auftrieb verleiht.In einigen Geräten fehlt Fließkomma-Mathematik vollständig, andere ist eine Linker-Option, um die enthaltene Version zu variieren. – crlanglois

5

Standardmäßig versucht AVR-libc, Speicherplatz in der Binärdatei zu sparen, indem es nicht in Gleitkommazahlen verknüpft wird. Für Funktionen wie atof das ist einfach, denn wenn Sie sie nicht anrufen, wird der Linker sie nicht enthalten. Für printf kann der Linker jedoch nicht feststellen, ob Sie ihn für Gleitkommazahlen verwenden möchten.

Stattdessen hat AVR-libc mehrere Bibliotheken, die printf definieren. Die printf in der Standardbibliothek verfügt über die volle Funktionalität, außer dass Gleitkommazahlen nicht unterstützt werden. Wenn Sie Speicherplatz in Ihrer Binärdatei sparen möchten und Sie nicht die erweiterten Funktionen von printf (nämlich Formatflags) verwenden, können Sie mit printf_min verknüpfen, um das durch eine jugendlichere Version zu ersetzen. Wenn Sie Fließkommazahlen drucken möchten, benötigen Sie die Vollversion, die in printf_flt definiert ist.

This page beschreibt die richtigen Linker-Optionen, um diese alternativen Versionen auszuwählen. Kurz gesagt, fügen Sie Ihren Linker-Optionen -Wl,-u,vfprintf -lprintf_flt -lm hinzu.