Wie verkette ich tatsächlich zwei Strings?

Ich verwende die SPISlave-Bibliothek und habe das folgende Codefragment:

 String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }  

Der Compiler mag meine Zeichenfolgenverkettung jedoch nicht:

/home/lars/sketch_apr01a/sketch_apr01a.ino: In der Lambda-Funktion: scale_apr01a: 65: 12: Fehler: Übergabe von „const String“ als „this“ -Argument von „String & String :: operator + = (const String &) „verwirft Qualifizierer [-fpermissive] arg + = String ((char *) data);

Ich habe auch andere Versionen mit ähnlichen Ergebnissen ausprobiert:

  • arg.concat((char *)data)
  • arg = arg + String((char *)data)
  • arg += String((const char *)data)

Wie genau schreibe ich das Ungewöhnliche? Operation?

Kommentare

  • Lustig, auf avr-g ++ ist es ' in Ordnung (mit Warnungen über Speicherdauer). Wie auch immer Wenn Sie die arg-Variable nach Wert erfassen, wirkt sich ' nicht auf die Variable außerhalb der Lambda-Funktion aus.

Antwort

Ihr Lambda erfasst arg per Kopie, was mit Sicherheit nicht das ist, was Sie wollen. Und da das Qualifikationsmerkmal mutable nicht vorhanden ist, können die erfassten Parameter nicht geändert werden. Daher der Compilerfehler.

Sie können den Fehler durch Qualifizieren beseitigen die Erfassung als mutable, aber Sie würden dann die erfasste Kopie von arg ändern, nicht die ursprüngliche. Die richtige Lösung wäre zu Erfassen Sie den String als Referenz, anstatt ihn durch Kopie zu erfassen. Siehe Lambda-Ausdrücke .

Aber dann stimme ich Michel Keijzers zu, dass Strings insgesamt vermieden werden ist eine bessere Option.

Kommentare

  • Sinnvoll, danke!
  • Danke auch für den Einblick und die richtige Antwort ( upvoted)

Antwort

Eigentlich für eine solche Zeichenfolgenverkettung (die in einer Funktion enthalten ist, die viel genannt werden kann ), dies könnte zu einer Speicherfragmentierung führen, und bei den meisten Arduinos wird der Speicher bald zu verstreut sein, als dass er nicht nützlich wäre y bleibt übrig.

Stattdessen ist es besser, vorher einen Puffer mit der maximalen Größe der Zeichenfolge zu erstellen, die Sie verarbeiten möchten, z. B.:

static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH]; 

Verwenden Sie die Funktion strcat oder strncat, um zwei Zeichenfolgen zu verketten. Es gibt generische C-Funktionen.

Kommentare

  • Fair genug und gute Ratschläge im Allgemeinen. Aber ich ' möchte immer noch die Antwort auf meine Frage wissen. 🙂
  • Ich frage mich, welchen Fehler Sie bei der Verwendung von concat erhalten (kann kein Fehler beim Übergeben von Zeichenfolgen sein). Vielleicht ein Casting zu const.

Antwort

#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2); 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.