ftostr
dtostr
printf
sprintf
es gibt sicher noch mehr
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 14: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 14:32 Uhr)
War mir auch suspekt, aber ich hatte es nicht richtig verstanden.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?
Das gesamte Programm mit 23 Unterprogrammen wäre wohl eine Zumutung. Diese Änderung darin ist nur eine Winzigkeit, die ich aber noch nicht gemacht habe und mir sehr viel einfacher vorgestellt hatte.Bitte aber auch grundsätzlich immer den kompletten Code neben den Schnipseln posten!
Zum Testen zunächst nur im SM (dafür würde ich die Umwandlung ja gar nicht benötigen), endgültig soll sie aber über eine bestehende Bluetooth-SS als Text zu einem Tablet übertragen werden.und wo bitte druckst du sie aus?
So habe ich das nun umgesetzt:
erhalte beim Kompilieren aber diese Fehlermeldung:Code:Serial.println(dtostrf(Akku_Spg, 5, 2, Akku_String));
"cannot convert 'String' to 'char*' for argument '4' to 'char* dtostrf(double, signed char, unsigned char, char*)'"
Akku_Spg habe ich als double und Akku_String als String deklariert.
vG
fredyxx
da haben wirs wieder! wo ist dein vollständiger Code???
wo zT hast du deinen "string" Akku_String deklariert??
offenbar aber nicht so wie ich es vorgegeben habe, oder?
char* Akku_String[20]; // oder was
Bei mir funktioniert der Code nämlich!
Und du weißt ja hoffentlich, dass string aus der String class oder aus C++ <cstring> etwas ganz anderes ist als ein ANSI C \0-terminierter char * array?
https://www.tutorialspoint.com/cplus...pp_strings.htm
Du weißt aber auch, dass double auf AVR nicht anderes ist als die ganz simplen 32-bit float, oder?
Geändert von HaWe (08.03.2017 um 15:49 Uhr)
Lesezeichen