Char[] nach const char* kopieren

Moin !

Ich stehe gerade etwas aufm schlauch. Und zwar habe ich einen Buffer in dem eine Zeichenkette steht:

    const size_t bufferLen = 80;
    char buffer[bufferLen];
    iniPtr->getValue("ESP", "Name", buffer, bufferLen);

Das klappt auch alles. Nun habe ich eine Klasse mit einer Variablen:

class SettingsClass
{
public:
	const char* Name;

Ich würde jetzt gerne den Inhalt aus dem Buffer in der Klassenvariable "Name" speichern.

strcpy(Name, buffer);
Klappt so leider nicht. Da meckert er const char * is not compatibel with char *

Kann mir jemand einen Tip geben wie ich den Text kopiert bekomme?

Grüße Dominik

Sie haben keinen Arbeitsspeicher zum Speichern von Inhalten
const char * Name ist nur ein pointer

Sie müssten den Speicher zuweisen

class SettingsClass
{
public:
	char Name[80];

Merkwürdig, so hatte ich das auch schon - bekam aber einen Error.
nun funktioniert es. Danke erstmal!

Es ist nicht empfehlenswert, den Speicher zu duplizieren. Vielleicht könnten Sie es nur in der Haupt-.ino halten und einen Pointer in der Klasse verwenden?

Wird nicht gedoppelt. Es steht nur kruze Zeit im Buffer (wird vom SPIFFS gelesen).
Brauche die Variable aber immer wieder und möchte ungerne ständig im SPIFFS lesen ...

Du brauchst eine Kopie des Textes für die Klasse.

Nur den Zeiger auf den Puffer einzutragen, funktioniert nur, solange sich der Puffer nicht ändert.

Korrekt.
Deswegen ja auch
strcpy(Name, buffer);
Das sollte ja dann eine Kopie ergeben.

Wenn du für Name einen Array nimmst, wird das gehen, mit deinem Pointer geht das ins Höschen.

char Name[NameMaxlen+1];

—> Heapspeicher?

(Höschen = panties :slight_smile: )

Das war genauso gemeint, ich bin Muttersprachler.

"In die Hose gehen" ist ein deutscher Ausdruck für etwas das nicht funktioniert, oder unangenehme Wirkungen hat.

That's exactly what I meant, German is my mothertongue.

Ich habe einen neuen Ausdruck gelernt! Danke

Wenn du in Zukunft Fragen hast, kann ich gerne versuchen, die zu beantworten.

Wenn der Name konstant sein soll (was ja auch oft Sinn macht), muss er gleich im Konstruktor per Initialisierungsliste gesetzt werden. Brauchst auf jeden Fall einen Konstruktor mit dem Namen als Parameter.

Habe ich auch erst gedacht, aber die gewünschte Verwendung schließt das aus.

Falls der späte Nachtrag (sorry) noch von Interesse ist:
Zeigt auf jeden Fall, dass (wie) der zu übergebende Text nur temporär vorhanden sein muss.

class Test : public Printable{
  private: const char _name[32]="";
  public: 
  Test (const char* name){
    strncpy ((char*)_name, name, sizeof(_name));
  }
  virtual size_t printTo(Print& p) const override {
    return p.print(_name);
  }
};
Test t("Hello");
void setup() {
  Serial.begin(9600);
  Serial.println(t);
}

void loop() {
  char temp[20];
  if (int len = Serial.readBytesUntil('\n', temp, 20)) {
     temp[len]= 0;
     Test test(temp);
     temp[0] = 0;  // das verändert test nicht mehr
     Serial.println(test);
  }
}

Ein Beispiel, mit Einschränkungen:

  • Der Puffer im Klassenelement für den const char ist fest (hier 32 Zeichen). Alternativ müsste man mit String oder new/delete arbeiten.
  • Um ihn im Konstruktor per strncpy zu beschreiben, muss das const "weggecastet" werden. Pfui.

Printable::printTo hat natürlich nichts mit der aktuellen Aufgabe zu tun. Nur damit die Testumgebung Serial.print(test); geht.