Estoy usando la biblioteca SPISlave y tengo el siguiente fragmento de código:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
Sin embargo, al compilador no le gusta mi concatenación de cadenas:
/home/lars/sketch_apr01a/sketch_apr01a.ino: En la función lambda: sketch_apr01a: 65: 12: error: pasar «const String» como «este» argumento de «String & String :: operator + = (const String &) «descarta los calificadores [-fpermissive] arg + = String ((char *) data);
También probé otras versiones, con resultados similares:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Entonces, ¿cómo escribo exactamente esto inusual operación?
Comentarios
- Gracioso, en avr-g ++ it ' s bien (con advertencias sobre duración de la tienda). , está capturando la variable arg por valor, por lo que no ' t afectará la variable fuera de la función lambda.
Respuesta
Su lambda está capturando arg
por copia, que ciertamente no es lo que desea. Y dado que no tiene el calificador mutable
, los parámetros capturados no son modificables. De ahí el error del compilador.
Puede deshacerse del error calificando la captura como mutable
, pero luego modificaría la copia capturada de arg
, no la original. La solución correcta sería capturar la cadena por referencia en lugar de capturar por copia. Consulte Expresiones Lambda .
Pero luego, estoy de acuerdo con Michel Keijzers en que evitar las cadenas por completo es una mejor opción.
Comentarios
- Tiene mucho sentido, ¡gracias!
- Gracias por la información y la respuesta correcta también ( upvoted)
Answer
En realidad, para tal concatenación de cadenas (que se encuentra en una función que se puede llamar mucho ), esto podría resultar en la fragmentación de la memoria, y en la mayoría de los Arduinos, la memoria pronto estará demasiado dispersa y no habrá memoria útil. y queda.
En cambio, es mejor crear de antemano un búfer con el tamaño máximo de la cadena que desea manejar, como:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
Y use la función strcat
o strncat
para concatenar dos cadenas; hay funciones genéricas de C.
Comentarios
- Bastante justo y un buen consejo en general. Pero ' todavía me gustaría saber la respuesta a mi pregunta. 🙂
- Me pregunto qué error obtiene al usar concat (no puede ser un error de operación de paso de cadena). Tal vez algún casting para const.
Responder
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);