@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
Code:
char * str[20];
float fvar;
sprintf( str, "%8.3f", fvar);
perfekt, aber nicht für AVRs.
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.
Lesezeichen