Zeichenk. als chararray sowohl als parameter als auch als Rückgabewerte

Hallo,

nachdem ich gelernt habe, dass die Benutzugn von variablen-Typ String Speicherprobleme verursachen kann will ich auf diesen Variablentyp konsequent verzichten. Alternativ kann man Zeichenketten ja auch in arrays of char speichern. Da weiß ich aber nicht wie man das als Parameter bzw. als Rückgabewert programmiert.

Das ganze soll dazu dienen kleine Textdateien im WIndows-INI-Stil zu parsen

Beispiel:

char TextLine[81] = "MyIdentifier=12345";

Jetzt möchte in Funktionen programmieren die folgendes machen

alle "strings" äh pardon Zeichenketten sollen als Array of chars gespeichert werden

char IDStr[81];
char Value[81];

pseudo-code ( weil ich ja nicht weiß wie man es wirklich programmiert)

IDStr = ExtractID(TextLine);
Value = ExtractVal(Textline);

die beiden obigen Zeilen sind zu verstehen als Funktionen denen ich den Array-of-Char namens "TextLine" als Parameter übergebe und die als Rückgabewert auch einen Array-of-Char "anliefern.

geht so was?

Die Hauptsache um die es mir geht ist, dass ich durch häufiges Zuweisen von neuen Zeichenketten mal kurz, mal lang, mal mittel viele Zeichen Speicherkorruption vermeiden will.
Wenn es dazu einen Weg gibt bei dem man milliardenmal String-Variablen
(ja genau diese gefährliche Sorte Arduino-Strings ) neue Werte zuweisen kann ohne das Speicherkorruption stattfindet soll mir der recht sein.

viele Grüße

Stefan

Da hat Tommy mal was zu geschrieben.
Zeichenketten.

char str[10];

char* func(const char* str)
{
   ....
   return str;
}

void loop()
{
   char* ptr = func(str);
   ...
}

Merke: Array Variablen zerfallen zu Zeigern auf das erste Element. Deshalb übergibt man einfach einen Zeiger

Den übergebenen Parameter wieder zurückgeben wird bei vielen der Standard C String Funktionen so gemacht. Damit kann man sie direkt in anderen Funktionen einsetzen die ebenfalls einen C String möchten.
Speichern tust du du das ein einem separaten Zeiger. Der zeigt dann auf eines der Zeichen in dem ursprünglichen Array. Je nach Anwendung kann das der Anfang sein, aber muss es nicht. Eine Funktion die ein Array mit irgendwas füllt würde einen Zeiger auf den Anfang liefern. Eine Funktion die nach etwas sucht könnte auch eine andere Position zurückgeben.
Aber einem Array kannst du nichts anderes zuweisen!

Was du nicht machen darfst ist einen Zeiger auf eine lokale nicht-statische Variable zurückgeben! Die hört am Ende der Funktion auf zu existieren und der Zeiger ist ungültig.

Hallo HotSystems,

vielen Dank für den Link

Hallo Serenifly,

sorry to say WAMH (W)ay A)bove M)y H)ead

TSEFMKL ToShortExplanationForMyKnowledgeLevel

also werde ich mich durch das Tutorial arbeiten.....

Moin Stefan,
gar so weit weg bist Du von der schönen C-Array-Beschreibung gar nicht. Dein Pseudocode zeigt es.
Musst Dich nur in kleinen Schrittchen vorwärts arbeiten.

Was genau machen ExtractID und ExtractVal?
< Hier Pause zum Nachdenken einfügen >

Richtig - aus der übergebenen Zeichenkette den Teil vor/nach dem "=" als (neue) Zeichenkette zurückgeben.

Und noch etwas kleinteiliger:

  • Was genau gibt "TextLine" an?
  • Kann man auf die Elemente eines Arrays einzeln zugreifen?
  • Wenn ja, wie?
  • (optional) Ist überhaupt eine Zeichenkette übergeben worden?
  • enthält sie ein Gleichheitszeichen?
  • Was muss am Ende eines C-Strings stehen?

Dann musst Du nur noch entscheiden, ob Du mit dem Speicher weiterarbeiten magst, in dem TextLine - sprich die beiden Teile - schon stehen oder andere Arrays für die Teile verwenden willst.

Wenn Du das hast, vereinfachen wir das zu einer Funktion mit der Möglichkeit, ggf. eine Fehlerbedingung und beide Teilstrings auf einmal zurückzugeben.

Gruß Walter