Hallo,
gibt es einen Befehl, der float-Variable in Strings umwandelt?
Ich dachte das wäre char(), der scheint es aber nicht zu sein.
vG
fredyxx
Hallo,
gibt es einen Befehl, der float-Variable in Strings umwandelt?
Ich dachte das wäre char(), der scheint es aber nicht zu sein.
vG
fredyxx
ftostr
dtostr
printf
sprintf
es gibt sicher noch mehr
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Wenn nicht kann man das auch recht schnell selber implementieren oder sich zusammen googlen ( https://www.microchip.com/forums/m183763.aspx)
@shedepe, Ceos
hier gilt das gleiche wie in einem anderen Thread bezgl. i2c:
Ihr vergesst leicht, dass Arduino != C/C++ ist.
Arduino benutzt es zwar , aber es IST es nicht.
sprintf z.B. funktioniert bei Arduino auf AVR cores z.B. nur für ints, aber ÜBERHAUPT NICHT für floats, es ist in lib.c disabled.
Nur auf ARM Arduinos funktioniert es.
Auch vsprintf gibt es für AVR core komplett überhaupt nicht (!),egal für welche Datentypen.
Bei ARM Arduinos hingegen doch, mit vollem stdio.h Funktionsumfang.
Aber auch die FILE -bezogen Varianten von stdio.h gibt es auf Arduinos nicht (fprintf, fscanf, fgets), da es für SD irrsinnigerweise bei Arduino kein Filesystem gibt.
Also: erst den Arduino Playground und Arduino Foren befragen, bevor hier zu vorschnell aus der Hüfte geschossen wird.
Für ARMs funktioniert also
perfekt, aber nicht für AVRs.Code:char * str[20]; float fvar; sprintf( str, "%8.3f", fvar);
Hier muss man sich behelfen mit etwas wie
Code:char * ftos(char*str, int len, int prec, double var) { int16_t l, p; dtostrf(var,len,prec,str); l = strlen(str); p = strchpos(str, '.'); if (l>len && p<len ) { dtostrf( var,len, max(0,len-p-1), str ); } else if ((p<=0 || p>=len) && l>len) { p= max(0,len-6); l= strlen( dtostre( var, str, p, 0 ) ); if(l<len && p==0) { strcat(str, " "); } } return str; }
Als Sparvariante funktioniert dabei dtostrf(var,len,prec,str); auch alleine.
Wenn Ihr also C/++ Lösungsideen postet, seid euch darüber bewusst, dass nicht alles auch auf Arduinos funktioniert, was es gemeinhin für g++ gibt.
Hinweise wie " kann man das auch recht schnell selber implementieren " sind aber in jedem Falle alles andere als hilfreich und können eigentlich nur als arrogante Ohrfeige für den Fragesteller empfunden werden.
Geändert von HaWe (08.03.2017 um 15:52 Uhr)
So krass habe ich es nicht empfunden, aber es klappte natürlich nicht.und können eigentlich nur als arrogante Ohrfeige für den Fragesteller empfunden werden
Das Fazit was ich nun gezogen habe funktioniert aber auch nicht.Als Sparvariante funktioniert dabei dtostrf(var,len,prec,str); auch alleine.
Muss dann doch der Code von HaWe als Funktion vorhandne sein?Code:Akku_Spg = analogRead(PIN_Akku_Spg); // Messwert einlesen Akku_Spg = Akku_Spg / 1023.0 * 21.51; // ergibt sich aus den engesetzten Widerständen Akku_String = dtostrf(Akku_Spg, 5, 2, Akku_String);
Die Werte, die ich erwarte sind immer positiv, haben nicht mehr als 2 Stellen vor dem Punkt und müssen nicht mehr als 2 Stellen hinter dem Punkt haben.
vG
fredyxx
du kannst nicht eine Variable sowohl als Argument in eine Funktion übergeben und sie ihr selber gleichzeitig als return-Wert zuweisen, und wo bitte druckst du sie aus?
char* zuweisungen gehen sowieso nie mit dem Gleichheitszeichen in C, wenn du den Inhalt eines char *Arrays auf einen anderen Array übertragen willst! Das geht nur mit strcpy() !
Bitte aber auch grundsätzlich immer den kompletten Code neben den Schnipseln posten!
Das Ergebnis der Umwandlung steht aber in dem deinem char-string, und du kannst es in 2 Schritten tun oder in 1, wenn du per Serial ausgeben willst:
die Syntax ist:
char* Akku_String[20]; // oder was
dtostrf(Akku_Spg, 5, 2, Akku_String);
Serial.print(Akku_String);
oder:
Serial.print( dtostrf(Akku_Spg, 5, 2, Akku_String) );
Geändert von HaWe (08.03.2017 um 15:32 Uhr)
Lesezeichen