¿Cómo concatenar realmente dos cadenas?

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *