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
J-M-L
May 20, 2021, 1:56pm
2
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!
J-M-L
May 20, 2021, 2:10pm
5
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];
J-M-L:
(Höschen = panties )
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.
J-M-L
May 20, 2021, 7:36pm
12
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.
system
Closed
September 22, 2021, 12:25pm
17
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.