ich möchte nochmal einen neues, sauberes topic zu einer bereits gestellten Frage aufmachen. Folgende einfache Befehlsfolge kann auf dem Arduino Uno Wifi Rev. 2 nicht sauber bearbeitet werden:
String currentLine = "%2216%22,%20%2217%22";
void setup()
{
Serial.begin(115200);
Serial.println(currentLine);
currentLine.replace("%22","");
Serial.println(currentLine);
currentLine.replace("%20","");
Serial.println(currentLine);
Serial.println("Das Ergebnis sollte 16,17 sein, ist es aber nicht.");
}
void loop()
{
}
Ich habe dies auf verschiedenen Arduino Uno Wifi Rev. 2 versucht, bekomme aber auf beiden Geräten das falsche Ergebnis heraus. Woran liegt das genau und gibt es da irgendeinen Workaround?
Das hatten wir doch schon mal besprochen, Problem mit currtentLine.replace - #51 by Rentner Und auch wenn Du die Fragestellung erneut versuchst vorzukauen, weil Du den bestehenden Thread nicht nutzen willst, wird die Antwort die Selbe sein:
Entweder Du nimmst einen Workarround oder ein anderes Board.
Da der Thread sich wiederholt, wiederhole ich auch meine Ansage:
Dieses mal etwas lauter! Wenn du eine URL/URI decodieren willst, dann verwende auch urldecode()
Logisch oder?
Das gibts in etlichen Varianten im Netz.
Vielleicht sogar in deiner Board Definition.
Zudem:
Wenn die String Implementierung dieser Board Definition defekt ist, dann repariere sie doch bitte. Da haben dann "alle" was von.
In den anderen Board Definitionen stecken ja offensichtlich funktionierende Varianten.
Es ist nicht sehr konstruktiv, ohne weitere Ausführungen zu sagen, dass es an der String-Klasse liegt. Diese Klasse erledigt die Job für die überwiegende Mehrheit der Fälle, wenn Sie sie ein wenig vorsichtig verwenden.
Das Problem ist, dass die String-Klasse in der Version für die MEGA-AVR-Architektur nicht mit den Fortschritten in anderen Architekturen auf dem Laufenden gehalten wurde
Das Arduino Uno Wifi scheint nicht sehr viel verwendet zu werden (besser direkt zu einem ESP32 zu gehen), daher kann es sein, dass es nicht die notwendige Aufmerksamkeit erhält....
Ich würde vorschlagen, einen Fehler zu melden in
Wenn Sie es beheben möchten, müssen Sie zur neuesten String-Klasse wechseln (vielleicht nicht so einfach wie das Kopieren der neuesten Version).
Danke für den Code.
Das Problem ist allerdings, dass ich ja als Ausgang einen String habe in meinem Programmablauf und nicht einfach einen char currentLine[] = "%2216%22,%20%2217%22"; definieren kann. Deshalb verwende ich currentLine.toCharArray, um einen char zu bekommen. Dann funktioniert aber removestr wieder nicht...
char* removestr(char* str, const char* str2Remove) {
if ((str == nullptr)) return str;
size_t len = strlen(str);
if (len == 0) return str;
size_t len2Remove = strlen(str2Remove);
if (len2Remove == 0) return str;
char *readFrom = str;
char *foundAt;
while ((foundAt = strstr(readFrom, str2Remove)) != NULL) {
memmove(foundAt, foundAt + len2Remove, (readFrom + len) - (foundAt + len2Remove) + 1); // move the '\0' at the same time
readFrom = foundAt;
len -= len2Remove;
}
return str;
}
void setup()
{
Serial.begin(115200);
String currentLine = "%2216%22,%20%2217%22";
int str_len = currentLine.length() +1;
Serial.println(str_len);
char char_array[str_len];
currentLine.toCharArray(char_array, str_len);
Serial.println(currentLine);
removestr(currentLine, "%22");
Serial.println(currentLine);
removestr(currentLine, "%20");
Serial.println(currentLine);
Serial.println("Das Ergebnis sollte 16,17 sein");
}
void loop() {}
Beim Kompilieren tritt der Fehler
sketch_sep11a:31:31: error: cannot convert 'arduino::String' to 'char*' for argument '1' to 'char* removestr(char*, const char*)'
removestr(currentLine, "%22");
^
sketch_sep11a:33:31: error: cannot convert 'arduino::String' to 'char*' for argument '1' to 'char* removestr(char*, const char*)'
removestr(currentLine, "%20");
``` auf
Manche Leute lernen, indem sie Hinweise und Anstöße bekommen, und sie nehmen es als persönliche Herausforderung, das Problem zu lösen, ohne mit einer Lösung gefüttert zu werden
Einige andere ziehen es vor, eine Lösung zu studieren, um ihre Fähigkeiten zu verbessern.
Solange Wissen erworben wird, bin ich mit allem einverstanden, was funktioniert.
also ich saß heute bestimmt 5h dran und habe mir viel angeschaut. war dann trotzdem froh, dass mir jmd einen Tipp geben konnte. Ich bin eben kein Profi-Programmierer...