Nun möchte ich NAME[1] mit einem anderen String aus newString[1] ändern.
NAME[1] = newString[1].c_str(); geht nicht.
Kann mir jemand dazu behilflich sein?
Hallo
was glaubst du wozu da const char * steht. es handelt sich um einen Zeiger auf eine Adresse mit fester Speicherzuweisung die nicht geändert werden kann.
Zudem versuchst Du ein Char array mit einem String Objekt zu vermischen.
char *Name[] {"Taster1", "Taster2", "Taster3", "Taster4", "Taster5"};
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
for (byte i = 0; i <= 4; i++) {
Serial.println(Name[i]);
}
byte l = strlen(Name[3]); // länge ermitteln
strncpy(Name[3], "Tastneu4", l); // Ist zu lang witrd abgeschnitten
for (byte i = 0; i <= 4; i++) {
Serial.println(Name[i]);
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Meine Idee war bei Programmstart Werte aus dem LittleFS System zu lesen um dann die Parameter zu ändern. Sonnst muss man ständig bei Namensänderungen das Programm neu kompilieren. Gibt es hierfür gar keine Lösung? Es wird halt das Array erwartet.
Du musst die Ursprungswerte so lang machen, dass alle Deine Zeichenketten rein passen. Oder Du musst einen komplett anderen Ansatz wählen (z.B. mit Containern).
das wird nix weden, Du kannst das zwar in ein char Arrry einlesen aber dann must du das anschließend trennen damit du es den einzelnen Variablen zuordnen kannst. Da ginge mit strtok(). Ist aber für Deinen Fall zu kompliziert denke ich.
schreibe die Texte untereinander in je eine Zeile. und verwende String Objekte. Dann kannst Du das zeileweise auslesen mit einer for schleife direkt zuordnen.
Leider wird das so auch nichts.
Wenn char* PROGMEM NAME[] {"Tase1", "Taste2", "Taste3", "Taste4"};
einmal als erstes deklariert wurde, werden zwar mit der Methode im Setup void die Werte in NAME[] geändert, aber irgendwie nicht berücksichtigt.
Du hast bisher nicht verstanden, was Dir geschrieben wurde.
Sie werden nicht geändert, weil sie nicht geändert werden können.
Nochmal: Sowohl bei const, als auch bei PROGMEM kannst Du die Inhalte nicht ändern.
wenn Du die Strings aus dem FS auslesen willst sollte das auch mit file.readStringUntil(terminator)
als Terminator ginge ein CR oder LF gehen
String NameB[5];
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println(" String Objekte füllen");
// oder aus File lesen
NameB[0] = "AAAA";
NameB[1] = "bbbbbbbbb";
NameB[2] = "c";
NameB[3] = "dd";
NameB[4] = "44444";
for (byte i = 0; i <= 4; i++) {
Serial.println(NameB[i]);
}
NameB[3] = "Elemet 3 geändert mit neuer Länge";
for (byte i = 0; i <= 4; i++) {
Serial.println(NameB[i]);
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Ich benutze das Modul button.ino von Jenz Fleischer für eine Web Relay Steuerung.
Und die Buttonnamen wollte ich Variable über LittleFS gestalten.
Das Modul ist halt so geschieben und benutzt char* PROGMEM.
Hallo,
ok dann werden c Zeichenketten verwendet. Dann wird es am einfachsten sein Du nutzt Den Ansatz aus meinem ersten Beispiel und legst die Länge der Texte nach deinen Bedürfnissen fest. Das Progmem kannst Du sicher einfach weglassen das sollte gehen. Einfach mal probieren.
Boh, Super vielen Dank,
bekomme zwar jetzt einen Warnhinweis:
warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
Aber es lest sich compaliren und es läuft.
if (LittleFS.begin()){
Serial.println("Dateisystem: initialisiert");
auslesen();
for(int i = 0; i < 4; i++) {
byte l = strlen(NAME[i]); // länge ermitteln
strncpy(NAME[i], newString[i].c_str(), l);
}
}else {
Serial.println("Dateisystem: Fehler beim initialisieren");
}