Jeg bruger SPISlave-biblioteket, og jeg har følgende kodestykke:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
Compileren kan ikke lide min streng sammenkædning, dog:
/home/lars/sketch_apr01a/sketch_apr01a.ino: I lambda-funktion: sketch_apr01a: 65: 12: fejl: videregiver “const String” som “dette” argument for “String & String :: operator + = (const String &) “kasserer kvalifikatorer [-fpermissive] arg + = String ((char *) data);
Jeg har også prøvet andre versioner med lignende resultater:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Så hvordan skriver jeg nøjagtigt dette usædvanlige operation?
Kommentarer
- Sjovt, på avr-g ++ er det ' fint (med advarsler om butikens varighed) , du er ved at fange arg-variablen efter værdi, så den vinder ' t påvirker variabel uden for lambda-funktionen.
Svar
Din lambda fanger arg
med kopi, hvilket bestemt ikke er, hvad du vil have. Og da den ikke har mutable
-kvalifikatoren, kan de fangede parametre ikke ændres. Derfor kompileringsfejl. fangsten som mutable
, men du vil derefter ændre den fangede kopi af arg
, ikke den originale. Den rigtige løsning ville være at fange strengen ved reference i stedet for at fange med kopi. Se Lambda-udtryk .
Men så er jeg enig med Michel Keijzers i at undgå strenge helt er en bedre mulighed.
Kommentarer
- Det giver perfekt mening, tak!
- Tak også for indsigten og det korrekte svar ( opstemt)
Svar
Faktisk for sådan streng sammenkædning (som er i en funktion, der kan kaldes meget ), dette kan resultere i hukommelsesfragmentering, og på de fleste Arduinos vil hukommelsen snart være spredt, så der ikke er noget nyttigt y er tilbage.
I stedet er det bedre at oprette en buffer på forhånd med den maksimale størrelse på den streng, du vil håndtere, som:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
Og brug funktionen strcat
eller strncat
til sammenkædning af to strenge; der er generiske C-funktioner.
Kommentarer
- Fair nok og generelt gode råd. Men jeg ' vil stadig gerne vide svaret på mit spørgsmål. 🙂
- Jeg spekulerer på, hvilken fejl du får, når du bruger concat (kan ikke være en streng, der passerer fejl). Måske noget 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);