Hvordan sammenkoble faktisk to strenger?

Jeg bruker SPISlave-biblioteket, og jeg har følgende kodebit:

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

Kompilatoren liker ikke strengkombinasjonen min, skjønt:

/home/lars/sketch_apr01a/sketch_apr01a.ino: I lambda-funksjon: sketch_apr01a: 65: 12: feil: passerer «const String» som «dette» argumentet for «String & String :: operator + = (const String &) «forkaster kvalifiserende [-fpermissive] arg + = String ((char *) data);

Jeg har også prøvd andre versjoner med lignende resultater:

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

Så hvordan skriver jeg akkurat dette uvanlige operasjon?

Kommentarer

  • Morsomt, på avr-g ++ er det ' fint (med advarsler om butikkens varighet). Uansett , du fanger arg-variabelen etter verdi, så den vil ' ikke påvirke variabelen utenfor lambdafunksjonen.

Svar

Din lambda fanger arg med kopi, som absolutt ikke er det du vil ha. Og siden den ikke har mutable -kvalifiseringen, kan ikke de fangede parametrene endres. Derfor kompileringsfeilen. fangsten som mutable, men du vil da endre den fangede kopien av arg, ikke den originale. Den riktige løsningen ville være å fange strengen ved referanse i stedet for å fange med kopi. Se Lambda-uttrykk .

Men så er jeg enig med Michel Keijzers i å unngå strenger helt er et bedre alternativ.

Kommentarer

  • Gjør perfekt mening, takk!
  • Takk for innsikten og riktig svar også ( oppstemt)

Svar

Egentlig for en slik streng sammenkobling (som er i en funksjon som kan kalles mye ), kan dette resultere i minnefragmentering, og på de fleste Arduinos vil minnet snart være spredt til at det ikke er noe nyttig minne y er igjen.

I stedet er det bedre å lage en buffer på forhånd med maksimal størrelse på strengen du vil håndtere, som:

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

Og bruk funksjonen strcat eller strncat for å sammenkoble to strenger; det er generiske C-funksjoner.

Kommentarer

  • Greit nok, og gode råd generelt. Men jeg ' vil likevel vite svaret på spørsmålet mitt. 🙂
  • Jeg lurer på hvilken feil du får når du bruker concat (kan ikke være en streng som passerer operasjonsfeil). Kanskje noen casting til konst.

Svar

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *