Come concatenare effettivamente due stringhe?

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); 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *