hallo, hat jemand eine code um einen float in eien string umzuwandeln. sprintf unterstützt das leider nicht. Bernd
Hallo Programmers, ich habe eine C-Funktion geschrieben, die ein Float in einem ascii String umwandelt. Bis zu 4 Stellen vor dem Komma und 3 Stellen hinter dem Komma. Kann auf mehrere oder wenigere Stellen angepasst werden, zwecks Genauigkeit/Schnelligkeit Wer Floatzahlen auf einem Display anzeigen oder per Uart senden will, braucht sowas. Es gibt noch keine fertig implementierte ftoa Funktion in AVRGCC. Verkaufe den Source-Code für 10 EURO, der beliebig in eigenen Projekte benutzt werden darf und natürlich nicht weitergegeben werden darf. Wenn ein bisschen Geld zusammen kommt, werde ich die Funktion hier umsonst posten. Ich brauche die Funktion selber nicht und habe gesehen, daß viele sowas brauchen; hab also die Zeit dafür extra investiert. Da viele Programmierer hier meistens für Firmen arbeiten, denke ich sind die 10 EURO kein Problem...man hockt bestimmt mehr wie 1 Stunde dran... auch ansonsten lohnt sich diese Zeit zu sparen, wenn man überhaupt weisst wie man sowas machen kann. Es sind 2 Funktionen, eine die einen Pointer auf ein String zurückgibt und eine die nichts zurückgibt,hier kann der Code zum Anzeigen an Display/Uart eingefügt werden. Als Parameter bekommt man eine Float Zahl. Die Funktion ist Speed optimiert. void ftoa(float ); char *ftoa(float ); Bestellungen per email an gabby@everymail.net Gruss, Gabby
Du verlangst 10 Euro für eine ftoa()-Funktion für die du eine Stunde gebraucht hast? Wieviel Geld war das doch gleich das du für die vielen tausend Stunden bezahlt hast die in AVR-GCC stecken? Sorry, ich finde das asozial. Wenn man was von der "Community" nimmt, sollte man auch bereit sein etwas zurückzugeben, und wenn es nur sowas vergleichsweise mickriges wie ftoa() ist. just my 2 cents Andreas
Die Diskussion erübrigt sich sowieso - AVR-GCC hat bereits eine komfortable Funktion zur Umwandlung von Float nach String: dtostrf(), siehe http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual.pdf.gz
p.s: gabby kannst dir deine lib verkauferei sparen...wenn bei gcc wirklich keine da ist werde ich in den nächsten tagen eine schreiben und hier posten...
Lad dir die aktuelle Version der avr-libc runter (http://savannah.nongnu.org/download/avr-libc/snapshots/), da sollte dtostr() dabei sein! Andreas
Also, um meine Float-Werte über UART auf's Display auszugeben, benutze ich innerhalb des printf-Befehls den Konvertierungs-Spezifizierer %f. Diverse Formatierungen sind möglich: Stellenanzahl, Unterdrückung vorlaufender Nullen, Stellen hinter dem Komma etc. Kennt AVR-GCC %f nicht? Naja, CodeVision kennt's auch nur vorläufig. Norbert
Hallo, kann mir bitte jamend verständlich erkläre wie ich die 4 dateien installieren soll (die 4 unter Source tar balls habe ich runtergeladen), ich habe die GCC version von der AvrFreaks seite drauf (Win32 build of avr-gcc 3.2, [11M] June.25, 2002) da ich mit C und GCC noch nich so viel zu tun hatte tue ich mich da ein bischen schwer. oder nennt mir ne quelle wo ausfürlich beschrieben is wie was in welcher reihenfolge zu tun is. Danke schon mal :-) Sebastian
Hi, als ich denn (Werbe)Beitrag für die ftoa-Funktion gelesen habe, dachte ich erst an einen Scherz. Leute gibt's... Aber mal ein anderes Problem´: wenn ich die dtostrf benutze, rundet werden die nachkommastellen immer gerundet. Bsp.: float tmp = 5,345; string[20]; dtostrf(tmp,1,3,string); //liefert dann 5.000 weiß jemand, woran das liegt? Habe 'nen ATMEGA32 und die aktuelle WINAVR-Version. Gruß, Alex
Alexander Heß wrote: > Hi, > > als ich denn (Werbe)Beitrag für die ftoa-Funktion gelesen habe, dachte > ich erst an einen Scherz. Leute gibt's... > > Aber mal ein anderes Problem´: wenn ich die dtostrf benutze, rundet > werden die nachkommastellen immer gerundet. Bsp.: > > float tmp = 5,345; Mach da mal einen Komma-*punkt* hinein :-) float tmp = 5.345; Das Perverse daran ist nämlich, dass dein Code absolut lupenreines C ist. Nur macht es nicht das was du denkst :-) float tmp = 5, 345; Der Kommaoprator wertet seine Argumente von links nach rechts aus. Das Endergebnis ist das Ergebnis vom am weitesten links stehenden Ausdruck. Im Grunde hast du einfach geschrieben: float tmp = 5; (da ja der zweite Ausdruck, 345, nichts sinnvolles macht)
Vielen Dank für den Tip. Das eklärt zumindest, warum nur Mist rauskam, als ich die Formatierung ausprobiert habe.Es gibt da allerdings noch ein Problem. In meinem eigentlichen Quellcode wird die Variable nicht auf diese Weise fest belegt, sondern ergibt sich aus einer Berechnung. unsigned short tmp; float f_erg; f_erg = tmp*20/4096; dtostrf(f_erg,2,3,sting); Trotzdem wird das Ergebnis immer auf ganze Zahlen gerundet. Liegt das vielleicht daran, das tmp eine Integer Variable ist? Müsste ich vielleicht f_erg = (float)tmp*20.0/4096.0 oder so ähnlich schreiben??? Bin da noch nicht ganz so fit. Gruß, Alex
Alexander Heß wrote: > Liegt das vielleicht daran, das tmp eine Integer Variable ist? Bei der obigen Berechnung ja. > Müsste ich vielleicht > > f_erg = (float)tmp*20.0/4096.0 > > oder so ähnlich schreiben??? Bin da noch nicht ganz so fit. Im Prinzip ja, aber die Typkonversion mit "(float)" kannste Dir sparen, wenn wenigstens einer der Operanden als Gleitkommawert gekennzeichnet ist (also mit ".0" am Ende). Es wird in Deinem Fall auch keinesfalls "gerundet", sondern es wird eine Ganzzahl-Division durchgeführt und der Rest "weggeschmissen". Du solltest Dir aber auch dringendst mal den Artikel zur Festkommaarithmetik ansehen. Gerade Deine Berechnung schreit förmlich danach (überleg v.a. mal, was eine Division durch 4096 eigentlich ist...)
>(überleg v.a. mal, was eine Division durch 4096 > eigentlich ist...) zwölf Mal rechts shiften? ;-) Werd mal Deinem Hinweis nachgehen und etwas lesen. Danke und Gruß, Alex
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.