Esp8266 Array Probleme

Hallo,
ich habe ein Problem Arrays befüllung bzw. Änderung.
Es gelingt mir nicht ein Array zu ändern.

Volgende Arrays sind vorhanden:

   const char*  PROGMEM NAME[] {"Taste1", "Taste2", "Taste3", "Taste4"};
   String newString[4];

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?

Gruß

Was meinst Du, was das bedeuten könnte?

Gruß Tommy

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.

Ok, const kann man weglassen.
Und wie könnte man soetwas änder?

Auch wenn Du das const weg lässt, kannst Du es nicht ändern. Es steht im PROGMEM und es sind nur Zeiger dahin.

Gruß Tommy

Hallo,
unter Berücksichtigung der Länge könntest du sowas machen.

schau mal hier.

Das könnte dann so aussehen


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:

}

Das ist aber schlecht.

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.

Hallo,
aber dann hast Du doch normale Variable , schau die mein Beispiel an

Heißt das, dass nur die Originale vorgegebene Länge verwendet werden kann?

Ich lese eine Textzeile mit Komma getrennt (für die einzelnen Tasten) in ein String array ein,
dann wollte ich das array in das NAME[] übergeben.

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).

Gruß Tommy

Hallo,
ja wenn du den Speicher für das Array mal zugewiesen hast dann ist es so

Oder du nutzt String Objekte

String Name[4];

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.

Gruß Tommy

Hallo,
warum klebst Du so an dem Progmem ?

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.

Dann musst Du es umschreiben oder kannst sie nicht ändern.
Was Du willst, interessiert den Compiler nicht.

Gruß Tommy

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.

Nachtrag
der hier ??

char* NAME[] {"Beleuchtung", "Pumpe", "Filter", "Lüftung"};

teste das mal ob das so geht

@fips sorry ich hoffe ich habe Deinen schönen Sketch nicht verschandelt :wink:
Gruß Heinz

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");
  }