Problem mit dtostrf

Moin,

ich bastel gerade etwas mit GPS Koordinaten herum und bin auch einen (für mich) unverständlichen Effekt gestoßen:

ein kleines Demoprogramm:

char LatDegStr[3];
char LatMinStr[2];
char LatSecStr[5];

float gps_lat = 50.356743;

dtostrf(abs(gps_lat), 3, 0, LatDegStr);
Serial.println(LatDegStr);
dtostrf(abs((gps_lat - (float)abs(gps_lat)) * (float)60), 2, 0, LatMinStr);
Serial.println(LatDegStr);
Serial.println(LatMinStr);
dtostrf(((gps_lat - (float)abs(gps_lat)) * (float)60 - abs((gps_lat - (float)abs(gps_lat)) * (float)60)) * (float)60, 5, 2, LatSecStr);
Serial.println(LatMinStr);

Die Ausgabe im Terminal schaut etwa so aus:


50

21


d.h.

  • das erste “Serial.println(LatDegStr)” gibt “50” aus - OK
  • das zweite “Serial.println(LatDegStr);” gibt nix aus

Genau so bei den Ausgaben bei LatMinStr.

Drehe ich das so, daß LatDegStr zuletzt ausgerechnet wird, dann fehlt LatMinStr und LatSecStr.

Warum ist das so? Ist das ein Bug, mach ich was falsch oder bin ich nur zu doof?
LatDegStr, LatMinStr und LatSecStr werden auch von keinen Interrupts o.ä. überschrieben.

Der Sketch ist auch noch im Rahmen:
Der Sketch verwendet 25.408 Bytes (82%) des Programmspeicherplatzes. Das Maximum sind 30.720 Bytes.
Globale Variablen verwenden 1.474 Bytes (71%) des dynamischen Speichers, 574 Bytes für lokale Variablen verbleiben.

PS: Falls die Frage aufkommt, warum ich int-Werte mit dtostrf caste: Ich möchte das auf einem Display ausgeben und den Feldern konstante breiten geben, damit bei einem Sprung von 99° aud 100° nicht alles ein Zeichen verschoben wird.

PPS: Target ist ein Atmega328 (Arduino Nano)

Ich denke dir fehlt der Platz für die die Strings begrenzenden '\0'. Mach deine char Arrays alle ein Byte länger.

Genau das wars. Das die \0 mit in's Array muß - daran hab ich gar nicht gedacht.

Dank dir für die schnelle Auskunft - ich hab schon an mir gezweifelt.