Sto utilizzando la libreria SPISlave e ho il seguente frammento di codice:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
Al compilatore non piace la mia concatenazione di stringhe, però:
/home/lars/sketch_apr01a/sketch_apr01a.ino: nella funzione lambda: sketch_apr01a: 65: 12: errore: passaggio di “const String” come “this” argomento di “String & String :: operator + = (const String &) “scarta i qualificatori [-fpermissive] arg + = String ((char *) data);
Ho provato anche altre versioni, con risultati simili:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Allora, come scrivo esattamente questo insolito operazione?
Commenti
- Divertente, su avr-g ++ ' va bene (con avvertimenti su durata del negozio) , stai acquisendo la variabile arg per valore, quindi ' non influirà sulla variabile al di fuori della funzione lambda.
Risposta
Il tuo lambda sta acquisendo arg
per copia, che sicuramente non è quello che vuoi. E poiché non ha il qualificatore mutable
, i parametri acquisiti non sono modificabili. Da qui lerrore del compilatore.
Potresti eliminare lerrore qualificando lacquisizione come mutable
, ma dovresti modificare la copia acquisita di arg
, non quella originale. La soluzione corretta sarebbe quella di catturare la stringa per riferimento invece di catturare per copia. Vedere espressioni Lambda .
Ma poi, concordo con Michel Keijzers che evitare del tutto le stringhe è unopzione migliore.
Commenti
- Ha perfettamente senso, grazie!
- Grazie per la comprensione e anche per la risposta corretta ( upvoted)
Answer
In realtà per tale concatenazione di stringhe (che è in una funzione che può essere chiamata molto ), questo potrebbe causare la frammentazione della memoria, e sulla maggior parte degli Arduino la memoria sarà presto troppo dispersa perché nessun y è lasciato.
Invece, è meglio creare in anticipo un buffer con la dimensione massima della stringa che si desidera gestire, come:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
E usa la funzione strcat
o strncat
per concatenare due stringhe; ci sono funzioni C generiche.
Commenti
- Abbastanza giusto e buoni consigli in generale. Ma ' vorrei ancora conoscere la risposta alla mia domanda. 🙂
- Mi chiedo quale errore ottieni quando usi concat (non può essere un errore delloperazione di passaggio di stringhe). Forse un po di casting per const.
Answer
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);