Formatierungsfrage mit sprintf

Hallo, Freunde des Elektrosports

Ich komme hier leider mit einer Formatierung nicht weiter.
Tante Google und dieses hiesige Forum habe ich schon durchsucht, jedoch zu keinem Ergenbis gekommen.
Programmierkenntnisse sind rudimentär vorhanden. Anbei mein Beispielsketch, wo man mein Problem erkennen kann:

void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);
  unsigned long Trip = 1123290000; //Zurückgelegte Strecke in mm
  char buf[500];
  char buf2[500];
  int Tageshunderter;

  Tageshunderter = (Trip/100000)%10;
  sprintf(buf, "%i.", Trip/1000000);  // Ausgabe in km mit anschließendem Punkt
  sprintf(buf2, "%i.%i", Trip/1000000, (Trip/100000)%10);  // Gibt als Nachkommastelle eine Null

  Serial.println("Tageshunderter:");Serial.println(Tageshunderter);
  Serial.println("Puffer1:");Serial.println(buf);
  Serial.println("Puffer2:");Serial.println(buf2);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Warum ich im Puffer2 immer eine Null als Nachkommastelle bekomme verstehe ich nicht.
Sicherlich korrektes Verhalten, ich vertsehe es aber nicht und benötige dort die "Tageshunderter".

Für Sachdienliche Hinweise oder gar eine Lösung bin ich sehr dankbar.

LG Roland

Hallo,

schalte alle Warnungen ein. Datei > Voreinstellungen > Compiler-Warnungen "ALLE".
Dann sieht man eher wo es klemmt. Hier demnach die Datentypen.

Ich habs mal geändert.

void setup() {
  Serial.begin(9600);
  unsigned long Trip = 1123290000; //Zurückgelegte Strecke in mm
  char buf[40];
  char buf2[40];
  int Tageshunderter;

  Tageshunderter = (Trip/100000)%10;
  int km = (Trip/1000000);
  sprintf(buf, "%d.", km);                      // Ausgabe in km mit anschließendem Punkt
  sprintf(buf2, "%d.%d", km, Tageshunderter);   // Gibt als Nachkommastelle eine Null

  Serial.print("Tageshunderter: ");Serial.println(Tageshunderter);
  Serial.print("Puffer1: ");Serial.println(buf);
  Serial.print("Puffer2: ");Serial.println(buf2);
}

void loop() {
  
}

hier sind die Parameter beschrieben, was nicht geht ist f für float. Dafür müsste man als Umgehung dtostrf verwenden.
http://www.cplusplus.com/reference/cstdio/printf/

Hallo Doc,

vielen lieben Dank. Da war wohl der Wald mit zu vielen Bäumen.
Die Compilerwarnungen habe ich nun drin, das wird sicher viele Fragen ersparen.

Im gehobenen Alter wird das Lernen nicht leichter :wink:

LG Roland

Hallo,

keine Sorge, darüber bin ich auch gestolpert und viele andere sicherlich auch.
Noch eine kleine Änderungen, damit alles unsigned konform ist.

void setup() {
  Serial.begin(9600);
  unsigned long Trip = 1123290000; //Zurückgelegte Strecke in mm
  char buf[40];
  char buf2[40];
  unsigned int Tageshunderter;

  Tageshunderter = (Trip/100000)%10;
  unsigned int km = (Trip/1000000);
  sprintf(buf, "%u.", km);                      // Ausgabe in km mit anschließendem Punkt
  sprintf(buf2, "%u.%u", km, Tageshunderter);   // Gibt als Nachkommastelle eine Null
  
  Serial.print("Tageshunderter: ");Serial.println(Tageshunderter);
  Serial.print("Puffer1: ");Serial.println(buf);
  Serial.print("Puffer2: ");Serial.println(buf2);
}

void loop() {
  
}

Schau dir mal das Format %03u an. Das ist evtl was für dich:

unsigned long trip = 1123290000; //Zurückgelegte Strecke in mm
unsigned int km = trip/1000000;
unsigned int m = (trip/1000)%1000;

sprintf(buf, "%u,%03u km", km, m); // 1123,290 (geht auch mit führenden Nullen ( 0,001 )

Und warum sollte man nicht einfach das korrekte Format benutzen statt Hilfsvariablen einzuführen?

void setup() {
  Serial.begin(250000);
  unsigned long Trip = 1123290000; //Zurückgelegte Strecke in mm
  char buf[15];
  char buf2[15];
  int Tageshunderter;

  Tageshunderter = (Trip / 100000) % 10;
  sprintf(buf, "%lu.", Trip / 1000000);
  sprintf(buf2, "%lu.%lu", Trip / 1000000, (Trip / 100000) % 10);

  Serial.print("Tageshunderter: ");
  Serial.println(Tageshunderter);
  Serial.print("Puffer1: ");
  Serial.println(buf);
  Serial.print("Puffer2: ");
  Serial.println(buf2);
}
void loop() {}
Tageshunderter: 2
Puffer1: 1123.
Puffer2: 1123.2

Hallo,

weil der Parameter lu nicht in der Liste von meinem Link steht. Warum eigentlich ... :o

Das schöne am Forum ist jeder kann Infos ergänzen oder korrigieren. :slight_smile: Was hiermit erfolgt ist.

Doc_Arduino:
weil der Parameter lu nicht in der Liste von meinem Link steht. Warum eigentlich ... :o

Keine Ahnung warum du das nicht siehst, es steht drauf. :wink:

Natürlich getrennt, weil 'u' ein format, 'l' aber eine Längenangabe ist.

Hallo,

jetzt wo du es sagst, eindeutig Leseschwäche.

Hallo,

ich bin da vor einiger Zeit schon mal drüber gestolpert, aber mit zunehmendem Alter wird man sicher vergesslicher :wink:

Auf einem ESP hab ich die Funktion snprintf mit der option f für float Werte im Einsatz klappt also ohne Probleme auf dem Ding. Heute wollte ich nach längerer Zeit das mal wieder auf einem UNO machen, und hab dann eine eine gefühlte Ewigkeit am Syntax rumgesucht. Bis mir dann irgendwann wieder das Licht aufging. Es geht einfach nicht !!!.

Gibts da eigendlich einen sinvollen Grund zu ? oder wurde das einfach nur vergessen, warum dann nicht längst mal mit aufgenommen .

Heinz

Rentner:
Gibts da eigendlich einen sinvollen Grund zu ?

Speichermangel. Der Float-Teil würde ca. 1,5kB belegen auch wenn man ihn gar nicht benutzt. Deshalb gibt es auf AVRs die nicht-Standard Funktion dtostrf() dafür

Wobei es theoretisch möglich wäre das unterschiedlich zu linken je nachdem ob man es in den IDE Optionen auswählt. Die Option für die (fast) vollständige Implementierung existiert nämlich. Siehe auch hier:
https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1

warum dann nicht längst mal mit aufgenommen .

Heinz

Esp8266 float mit printf und co geht auch erst seit 2.4.0.

Gruß Fips