Jeg bruker SPISlave-biblioteket, og jeg har følgende kodebit:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
Kompilatoren liker ikke strengkombinasjonen min, skjønt:
/home/lars/sketch_apr01a/sketch_apr01a.ino: I lambda-funksjon: sketch_apr01a: 65: 12: feil: passerer «const String» som «dette» argumentet for «String & String :: operator + = (const String &) «forkaster kvalifiserende [-fpermissive] arg + = String ((char *) data);
Jeg har også prøvd andre versjoner med lignende resultater:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Så hvordan skriver jeg akkurat dette uvanlige operasjon?
Kommentarer
- Morsomt, på avr-g ++ er det ' fint (med advarsler om butikkens varighet). Uansett , du fanger arg-variabelen etter verdi, så den vil ' ikke påvirke variabelen utenfor lambdafunksjonen.
Svar
Din lambda fanger arg
med kopi, som absolutt ikke er det du vil ha. Og siden den ikke har mutable
-kvalifiseringen, kan ikke de fangede parametrene endres. Derfor kompileringsfeilen. fangsten som mutable
, men du vil da endre den fangede kopien av arg
, ikke den originale. Den riktige løsningen ville være å fange strengen ved referanse i stedet for å fange med kopi. Se Lambda-uttrykk .
Men så er jeg enig med Michel Keijzers i å unngå strenger helt er et bedre alternativ.
Kommentarer
- Gjør perfekt mening, takk!
- Takk for innsikten og riktig svar også ( oppstemt)
Svar
Egentlig for en slik streng sammenkobling (som er i en funksjon som kan kalles mye ), kan dette resultere i minnefragmentering, og på de fleste Arduinos vil minnet snart være spredt til at det ikke er noe nyttig minne y er igjen.
I stedet er det bedre å lage en buffer på forhånd med maksimal størrelse på strengen du vil håndtere, som:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
Og bruk funksjonen strcat
eller strncat
for å sammenkoble to strenger; det er generiske C-funksjoner.
Kommentarer
- Greit nok, og gode råd generelt. Men jeg ' vil likevel vite svaret på spørsmålet mitt. 🙂
- Jeg lurer på hvilken feil du får når du bruker concat (kan ikke være en streng som passerer operasjonsfeil). Kanskje noen casting til konst.
Svar
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);