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)