Estou usando a biblioteca SPISlave e tenho o seguinte trecho de código:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
O compilador não gosta da minha concatenação de strings:
/home/lars/sketch_apr01a/sketch_apr01a.ino: Na função lambda: sketch_apr01a: 65: 12: erro: passar “const String” como “este” argumento de “String & String :: operador + = (const String &) “descarta os qualificadores [-fpermissive] arg + = String ((char *) data);
Também experimentei outras versões, com resultados semelhantes:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Então, como exatamente escrevo isto incomum operação?
Comentários
- Engraçado, no avr-g ++ ele ' está bem (com avisos sobre duração da loja). , você está capturando a variável arg por valor, então ' afetará a variável fora da função lambda.
Resposta
Seu lambda está capturando arg
por cópia, o que certamente não é o que você deseja. E como ele não tem o qualificador mutable
, os parâmetros capturados não são modificáveis. Daí o erro do compilador.
Você pode se livrar do erro qualificando a captura como mutable
, mas então você estaria modificando a cópia capturada de arg
, não a original. A solução correta seria capture a String por referência em vez de capturar por cópia. Consulte Expressões lambda .
Mas então, concordo com Michel Keijzers que evitar Strings completamente é a melhor opção.
Comentários
- Faz todo o sentido, obrigado!
- Obrigado pelo insight e pela resposta correta também ( voto positivo)
Resposta
Na verdade, para tal concatenação de string (que está em uma função que pode ser muito chamada ), isso pode resultar na fragmentação da memória e, na maioria dos Arduinos, a memória logo estará muito espalhada que nenhuma memória útil resta y.
Em vez disso, é melhor criar antecipadamente um buffer com o tamanho máximo da string que você deseja manipular, como:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
E use a função strcat
ou strncat
para concatenar duas strings; existem funções C genéricas.
Comentários
- Razoável e bons conselhos em geral. Mas eu ' ainda gostaria de saber a resposta à minha pergunta. 🙂
- Eu me pergunto qual erro você obtém ao usar concat (não pode ser um erro de operação de passagem de String). Talvez algum vazamento para const.
Resposta
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);