Jag använder SPISlave-biblioteket och jag har följande kodavsnitt:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
Kompilatorn tycker inte om min strängkompatering, dock:
/home/lars/sketch_apr01a/sketch_apr01a.ino: I lambda-funktion: sketch_apr01a: 65: 12: fel: skickar ”const String” som ”detta” argument för ”String & String :: operator + = (const String &) ”kasserar kvalificeringar [-fpermissive] arg + = String ((char *) data);
Jag har också provat andra versioner med liknande resultat:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Så hur exakt skriver jag det här ovanliga operation?
Kommentarer
- Roligt, på avr-g ++ är det ' bra (med varningar om lagringstid). Hur som helst , du fångar arg-variabeln efter värde, så den kommer ' t att påverka variabeln utanför lambdafunktionen.
Svar
Din lambda fångar arg
med kopia, vilket absolut inte är vad du vill ha. Och eftersom den inte har mutable
-kvalificatorn kan de fångade parametrarna inte ändras. Därför kompileringsfelet.
Du kan bli av med felet genom att kvalificera dig fångsten som mutable
, men du skulle då ändra den fångade kopian av arg
, inte den ursprungliga. Den rätta lösningen skulle vara att fånga strängen genom referens istället för att fånga med kopia. Se Lambda-uttryck .
Men då instämmer jag med Michel Keijzers att undvika strängar helt och hållet är ett bättre alternativ.
Kommentarer
- Ger perfekt mening, tack!
- Tack för insikten och rätt svar också ( uppröstad)
Svar
Egentligen för sådan strängkompatering (som är i en funktion som kan kallas mycket ), kan detta resultera i minnesfragmentering, och på de flesta Arduinos kommer minnet snart att spridas för att inget användbart minne y är kvar.
Istället är det bättre att i förväg skapa en buffert med den maximala storleken på strängen du vill hantera, som:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
Och använd funktionen strcat
eller strncat
för att sammanfoga två strängar; Det finns generiska C-funktioner.
Kommentarer
- Rättvis och bra råd i allmänhet. Men jag ' vill fortfarande veta svaret på min fråga. 🙂
- Jag undrar vilket fel du får när du använder concat (kan inte vara ett fel vid strängöverföring). Kanske en del casting till konst.
Svar
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);