Hans: ich habe mal deinen Quellcode "Neue-Zeichenketten2.ino" vom Posting #10 aufgenommen und es mal als Beispiel mit reinen C-Strings umgesetzt.
Diese Variante ist aber ohne das "PROGMEM" Extra, was in der vorgestellten Form auch etwas schwerer umzusetzen ist.
Kernstück ist eine C-Funktion mit variabler Parameterliste.
Das sieht so aus: serialPrint(true, pTxt[STEP], pTxt[ZAHL], " soll", NULL);
Beim Gebrauch dieser Funktion ist folgendes zu beachten:
Der erste Parameter muss immer angegeben werden. Er ist entweder "true" oder "false". Wird "true" übergeben, so wird beim letzten Wort der Liste ein Zeilenumbruch mit ausgegeben (wie bei Serial.println), wird "false" übergeben erfolgt das nicht (also wie Serial.print). Im Anschluss an diesen Wert beginnt die variable Parameterliste, der im Prinzip (RAM abhängig) beliebig viele Textpointer übergeben werden können. Wichtig ist, dass der letzte Übergabeparameter IMMER! NULL sein muss. Das ist notwendig, um das Ende der Parameterliste erkennen zu können. Wird das vergessen, wird es komisch.
Das Programm: https://wokwi.com/projects/334201469761749587
Wenn man dein Programmbeispiel compiliert (Nur mit den String Klassen BezA und BezB. Alles andere wurde gelöscht) liegt der Speicherverbrauch bei
RAM: [== ] 25.0% (used 512 bytes from 2048 bytes)
Flash: [= ] 14.5% (used 4468 bytes from 30720 bytes)
Bei dem oben verlinken Beispielprogramm sieht es wie folgt aus:
RAM: [== ] 17.5% (used 358 bytes from 2048 bytes)
Flash: [= ] 7.5% (used 2312 bytes from 30720 bytes)
Also der Speicherverbrauch ist mit C-Strings deutlich geringer (≈ -30% beim RAM und ≈ -48% Flash Speicher) als bei der Verwendung von "String". Und du kannst davon ausgehen, dass zur Laufzeit auch weniger RAM verbraucht wird. Die Programme wurden für einen Arduino Nano compiliert.
Eine schickere Variante gibt es hier: https://wokwi.com/projects/334256716602409554
Dabei funktioniert die Ausgabe analog zu sprintf() in vereinfachter Form. Dadurch, dass die Parameterzahl durch die Formatierungszeichen %c, %d oder %f angezeigt wird, entfällt die Übergabe von NULL beim Funktionsaufruf. Die boolsche Variable für den Zeilenumbruch ist nicht mehr notwendig, weil dieser durch die Eingabe von "\n" im Formatstring erzeugt werden kann.
Dass, im Gegensatz zur ersten Variante, verschiedene Datentypen übergeben werden können ist ebenfalls ein Vorteil. Allerdings verbraucht die Funktion printSerial() natürlich etwas mehr Speicherplatz als die erste Variante. Außerdem belegen die Formatstrings auch wieder Platz. Dennoch ist das Programm immer noch sparsamer als die Sting Klassenvariante, obwohl noch zusätzlicher Text zu Demonstrationszwecken ausgegeben wird:
RAM: [== ] 22.6% (used 462 bytes from 2048 bytes)
Flash: [= ] 13.0% (used 3982 bytes from 30720 bytes)
Das soll es dann aber dazu gewesen sein, sofern keine neuen Fragen auftauchen.