Float in Array und Dezimalzeichen ändern

Hallo Profis,

ich stehe auf dem Schlauch.

Habe einen Sensorwert temp als float, bringe den in einen String mit

dtostrf(temp,5,2,PufferChar);

Jetz brauche ich noch die Ausgabe mit Komma als Dezimalzeichen.
Habe bei den Mikrocontrolern gewildert, blicke aber echt nicht durch.

Prinzip wie ich es verstanden habe:

  • den String in ein Array packen
  • Array durchlaufen, auf "." prüfen und mit z.B. "," ersetzen

Kann mir jemand das verständlich näherbringen wie man das umsetzt?

Oder gibt's ne einfachere Variante?

Klaus_ww:
Kann mir jemand das verständlich näherbringen wie man das umsetzt?
Oder gibt's ne einfachere Variante?

Eine einfachere Variante könnte sein, einen String-String zu verwenden. Da gibt es die Methode replace().

Ansonsten:

  • Ziel-Zeichenkette gleicher Länge anlegen
  • For-Schleife, die so lang läuft, wie die Zeichenkette Zeichen hat.
  • bei jedem Durchlauf testen, ob Zeichen[index] ein Punkt ist
  • wenn ja, Komma in die Ziel-Zeichenkette schreiben,
  • sonst Punkt.

HTH

Gregor

Klaus_ww:

  • den String in ein Array packen

Hast Du mit deinem dtostrf ja schon gemacht.

Dann nur noch:

for ( byte i=0; PufferChar[i]!=0; i++ ){ if (PufferChar[i] == '.') PufferChar[i] = ','; }
  *strchr(PufferChar, '.') = ',';

Da du weisst, dass der Text einen Punkt enthält, kannst du dir den Test auf NULL sparen
und den von strchr() zurückgegebenen Pointer direkt benutzen.

Uhhh, String ... zurückgegebener Pointer ... das probier ich mal aus. Aber jetzt ist Ostern - da wird Rumprobieren nach hinten geschoben.

Melde mich nächste Woche mit Erfolgs- oder Frustnachricht :grin:

Danke euch, schöne Ostertage!

gregorss:
Eine einfachere Variante könnte sein, einen String-String zu verwenden. Da gibt es die Methode replace().

Nein, das ist nicht einfacher. Das einfachste ist was Whandall gezeigt hat

  • For-Schleife, die so lang läuft, wie die Zeichenkette Zeichen hat.

char Arrays lassen sich auch sehr einfach mit Zeigern iterieren:

void setup()
{
  Serial.begin(9600);

  char str[] = "123.45";

  char* ptr = str;
  while(*ptr)
  {
    if (*ptr == '.')
    {
      *ptr = ',';
      break;
    }
    ptr++;
  }

  Serial.println(str);
}

void loop()
{
}

while(*ptr) ist solange wahr wie an der Stelle kein NULL steht; das heißt man ist noch nicht am Ende des Strings. Dann fragt man ab ob man ersetzen muss. Und wenn nicht inkrementiert man den Zeiger

Also vom Prinzip hab ich das wieder kapiert, aber mit dieser Syntax steh ich auf Kriegsfuß.

Vorne ein Sternchen, hinten ein Sternchen ... da ist der Groschen bei mir noch nicht gefallen.
Da gab's mal eine feine Erklärung hier, muss mal schauen.

Aber wie immer bei solcher Hilfe klappt's am Ende - nur blöd, wenn man nicht umreißt was man da genau treibt :confused:

Klaus_ww:
Vorne ein Sternchen, hinten ein Sternchen ... da ist der Groschen bei mir noch nicht gefallen.

char* ptr ist ist ein Zeiger auf char der ptr heißt

*ptr ist die Dereferenzierung der Variable. Das heißt du spricht nicht die Adresse an, sondern was darin steht

Serenifly:
... Nein, das ist nicht einfacher. Das einfachste ist was Whandall gezeigt hat ...

Mit „einfacher“ meinte ich nicht, dass es die wenigsten Zeichen im Programmtext benötigt, sondern dass es ein einfacher Workaround sein könnte.

Whandalls Code ist wahrscheinlich schneller und benötigt mit Sicherheit weniger Speicher, aber um das wirklich verstehen zu können, muss man deutlich mehr als ein Anfänger sein.

Gruß

Gregor

deutlich mehr als ein Anfänger

Sollte auch ein Anfänger verstehen. Wenn der sich danach nicht mehr als Anfänger fühlt, auch ok. :wink:

Irgendwann sollte man sich zutrauen, "Pointer, * und & versteh ich nicht " zu überwinden.

michael_x:
Sollte auch ein Anfänger verstehen. Wenn der sich danach nicht mehr als Anfänger fühlt, auch ok. :wink:
Irgendwann sollte man sich zutrauen, "Pointer, * und & versteh ich nicht " zu überwinden.

Du hast natürlich recht. Ich hatte zu schnell gelesen.

Zudem kenne ich die ganzen Funktionen für C-Strings nicht, weil mein C++-Buch das alles übergeht. Als ich neulich gucken wollte, wie dort eigentlich structs erklärt sind, fand ich nur den kurzen Hinweis, dass Structs im Grunde wie Klassen sind, deren Elemente durchweg öffentlich sind.

Naja, ich befasse mich erst seit '08 mit C++. Ich habe noch ein paar Jahre Zeit, bis ich ein guter C++-Programmierer sein sollte.

Gruß

Gregor

gregorss:
Whandalls Code ist wahrscheinlich schneller und benötigt mit Sicherheit weniger Speicher, aber um das wirklich verstehen zu können, muss man deutlich mehr als ein Anfänger sein.

strchr() ist eine Standard C Funktion die gut dokumentiert ist

ich neulich gucken wollte, wie dort eigentlich structs erklärt sind, fand ich nur den kurzen Hinweis, dass Structs im Grunde wie Klassen sind, deren Elemente durchweg öffentlich sind.

Das ist auch die korrekte Antwort :slight_smile: