Comment concaténer réellement deux chaînes?

Jutilise la bibliothèque SPISlave et jai lextrait de code suivant:

 String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }  

Le compilateur naime pas ma concaténation de chaîne, cependant:

/home/lars/sketch_apr01a/sketch_apr01a.ino: Dans la fonction lambda: sketch_apr01a: 65: 12: erreur: en passant « const String » comme « this » argument de « String & String :: operator + = (const String &) « rejette les qualificatifs [-fpermissive] arg + = String ((char *) data);

Jai également essayé dautres versions, avec des résultats similaires:

  • arg.concat((char *)data)
  • arg = arg + String((char *)data)
  • arg += String((const char *)data)

Alors, comment écrire exactement cela inhabituel opération?

Commentaires

  • Drôle, sur avr-g ++ ça va ' (avec des avertissements sur durée de stockage). Quoi quil en soit , vous capturez la variable arg par valeur, donc elle naffectera pas ' la variable en dehors de la fonction lambda.

Réponse

Votre lambda capture arg par copie, ce qui nest certainement pas ce que vous voulez. Et comme il na pas le qualificatif mutable, les paramètres capturés ne sont pas modifiables. Doù lerreur du compilateur.

Vous pouvez vous débarrasser de lerreur en qualifiant la capture sous la forme mutable, mais vous modifieriez alors la copie capturée de arg, et non celle dorigine. La solution correcte serait de capturer la chaîne par référence au lieu de capturer par copie. Voir expressions Lambda .

Mais dans ce cas, je suis daccord avec Michel Keijzers pour dire déviter complètement les chaînes est une meilleure option.

Commentaires

  • Cest parfaitement logique, merci!
  • Merci pour la perspicacité et la bonne réponse aussi ( upvoted)

Answer

En fait pour une telle concaténation de chaînes (qui est dans une fonction qui peut être appelée beaucoup ), cela pourrait entraîner une fragmentation de la mémoire, et sur la plupart des Arduinos, la mémoire sera bientôt trop dispersée quaucun souvenir utile y est laissé.

Au lieu de cela, il est préférable de créer au préalable un tampon avec la taille maximale de la chaîne que vous souhaitez gérer, comme:

static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH]; 

Et utilisez la fonction strcat ou strncat pour concaténer deux chaînes; il existe des fonctions génériques en C.

Commentaires

  • Assez juste, et de bons conseils en général. Mais jaimerais encore ' connaître la réponse à ma question. 🙂
  • Je me demande quelle erreur vous obtenez lors de lutilisation de concat (ne peut pas être une erreur dopération de passage de chaîne). Peut-être un casting en const.

Réponse

#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2); 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *