Muss man mal wissen, dass es so etwas gibt.
Damit kann man char-Arrays an Methoden als string übergeben usw.
Mehrere Datentypen für einen Speicherbereich.
Muss man mal wissen, dass es so etwas gibt.
Damit kann man char-Arrays an Methoden als string übergeben usw.
Mehrere Datentypen für einen Speicherbereich.
ja, aber gerade bei cstring musst du beachten, dass sie immer ausDamit kann man char-Arrays an Methoden als string übergeben usw.
char
und nicht aus uint8_t bestehen:
char str1[20];
char* str2;
und dass char in cstrings bei AVR kein byte und auch kein uint8_t (0..255) sondern ein signed char ist (-128..+127).
Bei ARM/ESP hingegen ist die cstring-char unsigned, also quasi "wie ein byte".
Aber auch wenn char hier unsigned sind, kann man dennoch nicht byte oder uint8_t arrays dafür einsetzen bzw. verwenden.
Genau darauf wollte ich oben in meinen Posts #5 und #7 hinaus.
Muss man drauf achten, was man tut.
Habs jetzt mal so gemacht:
Zugriff:Code:union xyzS{ uint8_t byt[6]; //XYZ-Array: 3 Werte mit 16 Bit uint16_t val[3]; }; xyzS xyzSet;
Code:f.read(xyzSet.byt,6); uint16_t ACX = xyzSet.val[0]; uint16_t ACY = xyzSet.val[1]; uint16_t ACZ = xyzSet.val[2];
Geändert von Moppi (21.05.2019 um 04:20 Uhr) Grund: Änderung
Ich hatte das Problem, mit unterschiedlichen Aufrufparametern / Datentypen einer Funktion.
Jetzt kann man eine neue Funktion erstellen, normalerweise mit neuem Namen.
Jetzt hatte ich aber, aus weit zurückliegender Vergangenheit C++ Kurs, eine Eingebung, dass da was mit den Parametern war, insbesondere im Zusammenhang mit Methoden.
In C geht das nicht, dass man eine Funktion gleich benennt. Aber C++ erlaubt das - habe kurz gesucht und nachgelesen.
bool udp_send(char* string)
{
}
bool udp_send(String string)
{
}
C++ wählt, je nach Datentyp in den Übergabeparametern, die passende Funktion aus.
Der eigentliche Grund dafür:
mit ist noch unklar, wie ich in C++ einen String, Typs "String" in ein String, Typs "char" umwandle.
Und ob das überhaupt geht.
Müsste aber, habe was dazu gefunden: https://www.arduino.cc/reference/en/...s/tochararray/
Allerdings wird da der gesamte String als Kopie im Speicher abgelegt. Vermutlich passiert das Kopieren zur Laufzeit.
Das ist weniger gefällig.
MfG
Geändert von Moppi (21.05.2019 um 07:09 Uhr)
ja, du brauchst hier immer 2 verschiedene Variablen, da beide unabhängige Datentypen sind und nichts miteinander zu tun haben:
einen cstring von passender Größe
char cbuf[100];
und einen
String mString;
du kannst jetzt den Inhalt von String mString auf char cbuf[] kopieren:
mString.toCharArray(cbuf, 100);
Ist die Länge von mString kürzer als die vom cstring, wird in cstring hinter das letzte mString-Zeichen eine Null '\0' gesetzt (ich weiß allerdings jetzt grade nicht, ob der Rest ebenfalls mit '\0' aufgefüllt wird oder undefiniert bleibt).
- - - Aktualisiert - - -
PS,
es gbt noch eine 2. String-Methode, die einen Pointer auf den "reinen cstring-Inhalt" von String zurückliefert:
mString.c_str()
Ich habe das noch nicht benutzt, aber ich verstehe das so, dass du dann (z.B. für temporäre Zwecke) keinen extra cstring Buffer brauchst, z.B. direkt zur Verwendung in anderen C Funktionen, so als wäre es bereits selber ein cstring array. Vermutlich arbeitet die Methode genau wie beim großen Bruder, der C++ std::string class:
http://www.cplusplus.com/reference/string/string/c_str/
Ja, c_str() funktioniert in Verbindung mit write().
Gut!
Gibt aber einen "const char*" Datentyp zurück?
gibt dann so Meldungen dass von const char* nach char* ein Konvertierungsfehler auftritt.
- - - Aktualisiert - - -
c_str() gibt const char*
Ja ist wohl so, habe es woanders gelesen.
Geändert von Moppi (21.05.2019 um 12:08 Uhr)
Lesezeichen