Nun benötige ich aber für message einen variablen String und habe mich
mit der Typumwandung herumgequält. Der folgende Code wird zwar ohne
Fehler compiliert, aber Serial.println(message) ist leer und auch das
was gesendet wird. Der Empfänger stellt zwar fest, es wurde etwas
gesendet, aber auch dort ist die Ausgabe in den seriellen Monitor leer
...
1
...
2
String mystr = "test message.";
3
char* message;
4
mystr.toCharArray(message, mystr.length());
5
Serial.println(message); //<--- das gibt eine leere Zeile
Die Anzahl der gesendeten Zeichen wird vom Empfänger richtig erkannt,
nur die Sendung selbst ist quasi unsichtbar und belegt im seriellen
Monitor die Länge null. Code auf Empfängerseite:
1
...
2
int messageSize = networkDevice.available();
3
if (messageSize > 0)
4
{
5
Serial.print("receive: ");
6
Serial.print((char*)networkDevice.getMessage());
7
Serial.print(" - ");
8
Serial.println(messageSize);
9
}
10
...
Kann mir bitte mal jemand zeigen, wie es richtig geht? Ist bestimmt nur
eine Kleinigkeit. Danke.
Seit wann gibt es toCharArry in C++?
Du knnst einfach mystr.c_str() machen um enen zeiger darauf zu
bekommn...
Wenn du den String erst kopieren möchtest:
char* message = new char[mystr.length()+1]
memcpy(message, mystr.c_str(), mystr.length()+1)
Wilhelm M. schrieb:> Frank E. schrieb:>> Danke! Die zwei Zeilen von o.O. mit memcpy tun, was sie sollen.>> Und schon haben wir ein Speicherleck ...
Ja, habe ich inzwischen auch gemerkt, läuft nur immer eine zeitlang ...
Frank E. schrieb:> Wilhelm M. schrieb:>> Frank E. schrieb:>>> Danke! Die zwei Zeilen von o.O. mit memcpy tun, was sie sollen.>>>> Und schon haben wir ein Speicherleck ...>> Ja, habe ich inzwischen auch gemerkt, läuft nur immer eine zeitlang ...
Warum willst Du es überhaupt in ein C-Array kopieren?
Weil Du eigentlich snprintf() verwenden willst?
Du kannst das C-Array lokal auf dem Stack allokieren, wenn Dein Stack
nicht überläuft.
Du kannst es statisch allokieren.
Du kannst es (wie oben) dynamsich allokieren, dann aber wieder löschen.
Du kannst auch std::array oder std::vector nehmen.
Du kannst auch std::unique_ptr<[]> nehmen.
>> das tut aber jetzt!
Klaro.
Ich hoffe, Du verstehst den Unterschied. Falls nicht, kauf die ein
C-Buck, besser eines über C++ !
P.S.: Willst Du tatsächlich das Sentinel mit senden?
DerEgon schrieb:> Und was spricht dagegen, den einfachsten Ansatz zu wählen?
Der einfache Ansatz ist zu einfach.
Zu zuverlässig.
Und viel zu wenig beeindruckend.
Frank E. schrieb:> Wilhelm M. schrieb:>> Frank E. schrieb:>>> Danke! Die zwei Zeilen von o.O. mit memcpy tun, was sie sollen.>>>> Und schon haben wir ein Speicherleck ...>> Ja, habe ich inzwischen auch gemerkt, läuft nur immer eine zeitlang ...
musst natürlich mit free den Speicher wieder freigeben...
free(message)
Aber ja unnötig ist das ganze.
o.O schrieb:> Frank E. schrieb:>> Wilhelm M. schrieb:>>> Frank E. schrieb:>>>> Danke! Die zwei Zeilen von o.O. mit memcpy tun, was sie sollen.>>>>>> Und schon haben wir ein Speicherleck ...>>>> Ja, habe ich inzwischen auch gemerkt, läuft nur immer eine zeitlang ...>> musst natürlich mit free den Speicher wieder freigeben...> free(message)
malloc/calloc/realloc -> free
new -> delete
Aber das ist alles old-school (und so auch nicht exception-safe).
Nimm std::unique_ptr.
Wilhelm M. schrieb:> malloc/calloc/realloc -> free> new -> delete>> Aber das ist alles old-school (und so auch nicht exception-safe).> Nimm std::unique_ptr.
stimmt! Ich bin C C++ verseucht