Hur sammanfogar man egentligen två strängar?

Jag använder SPISlave-biblioteket och jag har följande kodavsnitt:

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

Kompilatorn tycker inte om min strängkompatering, dock:

/home/lars/sketch_apr01a/sketch_apr01a.ino: I lambda-funktion: sketch_apr01a: 65: 12: fel: skickar ”const String” som ”detta” argument för ”String & String :: operator + = (const String &) ”kasserar kvalificeringar [-fpermissive] arg + = String ((char *) data);

Jag har också provat andra versioner med liknande resultat:

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

Så hur exakt skriver jag det här ovanliga operation?

Kommentarer

  • Roligt, på avr-g ++ är det ' bra (med varningar om lagringstid). Hur som helst , du fångar arg-variabeln efter värde, så den kommer ' t att påverka variabeln utanför lambdafunktionen.

Svar

Din lambda fångar arg med kopia, vilket absolut inte är vad du vill ha. Och eftersom den inte har mutable -kvalificatorn kan de fångade parametrarna inte ändras. Därför kompileringsfelet.

Du kan bli av med felet genom att kvalificera dig fångsten som mutable, men du skulle då ändra den fångade kopian av arg, inte den ursprungliga. Den rätta lösningen skulle vara att fånga strängen genom referens istället för att fånga med kopia. Se Lambda-uttryck .

Men då instämmer jag med Michel Keijzers att undvika strängar helt och hållet är ett bättre alternativ.

Kommentarer

  • Ger perfekt mening, tack!
  • Tack för insikten och rätt svar också ( uppröstad)

Svar

Egentligen för sådan strängkompatering (som är i en funktion som kan kallas mycket ), kan detta resultera i minnesfragmentering, och på de flesta Arduinos kommer minnet snart att spridas för att inget användbart minne y är kvar.

Istället är det bättre att i förväg skapa en buffert med den maximala storleken på strängen du vill hantera, som:

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

Och använd funktionen strcat eller strncat för att sammanfoga två strängar; Det finns generiska C-funktioner.

Kommentarer

  • Rättvis och bra råd i allmänhet. Men jag ' vill fortfarande veta svaret på min fråga. 🙂
  • Jag undrar vilket fel du får när du använder concat (kan inte vara ett fel vid strängöverföring). Kanske en del casting till konst.

Svar

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *