Folosesc biblioteca SPISlave și am următorul fragment de cod:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
Compilatorul nu-i place concatenarea șirului meu, deși:
/home/lars/sketch_apr01a/sketch_apr01a.ino: În funcția lambda: sketch_apr01a: 65: 12: eroare: trecând „const String” ca „acest” argument al „String & String :: operator + = (const String &) „discards califiers [-fpermissive] arg + = String ((char *) data);
Am încercat și alte versiuni, cu rezultate similare:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Deci, cum anume scriu acest lucru neobișnuit operațiune?
Comentarii
- Amuzant, pe avr-g ++ este ' bine (cu avertismente despre durata magazinului). Oricum , capturați variabila arg după valoare, deci nu va afecta ' t afectarea variabilei în afara funcției lambda.
Răspuns
Lambda ta captează arg
prin copiere, ceea ce cu siguranță nu este ceea ce dorești. Și întrucât nu are calificativul mutable
, parametrii capturați nu sunt modificabili. Prin urmare, eroarea compilatorului.
Ați putea scăpa de eroare calificându-vă captura ca mutable
, dar atunci veți modifica copia capturată a arg
, nu cea originală. Soluția corectă ar fi să capturați șirul prin referință în loc să capturați prin copiere. A se vedea Expresii Lambda .
Dar apoi sunt de acord cu Michel Keijzers că evitarea șirurilor este o opțiune mai bună.
Comentarii
- Are perfect sens, mulțumesc!
- Vă mulțumim și pentru înțelegere și pentru răspunsul corect ( votat în sus)
Răspuns
De fapt, pentru o astfel de concatenare șir (care se află într-o funcție care poate fi numită mult ), acest lucru ar putea duce la fragmentarea memoriei, iar pe majoritatea Arduino-urilor, memoria va fi curând prea împrăștiată, încât să nu existe niciun memor util y este lăsat.
În schimb, este mai bine să creați în prealabil un buffer cu dimensiunea maximă a șirului pe care doriți să îl manipulați, cum ar fi:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
Și utilizați funcția strcat
sau strncat
pentru concatenarea a două șiruri; există funcții C generice.
Comentarii
- Destul de corect și sfaturi bune în general. Dar îmi ' încă îmi place să aflu răspunsul la întrebarea mea. 🙂
- Mă întreb ce eroare obțineți atunci când utilizați concat (nu poate fi o eroare de operație String trecând). Poate că unele aruncări la const.
Răspuns
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);