Hvordan sammenkædes faktisk to strenge?

Jeg bruger SPISlave-biblioteket, og jeg har følgende kodestykke:

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

Compileren kan ikke lide min streng sammenkædning, dog:

/home/lars/sketch_apr01a/sketch_apr01a.ino: I lambda-funktion: sketch_apr01a: 65: 12: fejl: videregiver “const String” som “dette” argument for “String & String :: operator + = (const String &) “kasserer kvalifikatorer [-fpermissive] arg + = String ((char *) data);

Jeg har også prøvet andre versioner med lignende resultater:

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

Så hvordan skriver jeg nøjagtigt dette usædvanlige operation?

Kommentarer

  • Sjovt, på avr-g ++ er det ' fint (med advarsler om butikens varighed) , du er ved at fange arg-variablen efter værdi, så den vinder ' t påvirker variabel uden for lambda-funktionen.

Svar

Din lambda fanger arg med kopi, hvilket bestemt ikke er, hvad du vil have. Og da den ikke har mutable -kvalifikatoren, kan de fangede parametre ikke ændres. Derfor kompileringsfejl. fangsten som mutable, men du vil derefter ændre den fangede kopi af arg, ikke den originale. Den rigtige løsning ville være at fange strengen ved reference i stedet for at fange med kopi. Se Lambda-udtryk .

Men så er jeg enig med Michel Keijzers i at undgå strenge helt er en bedre mulighed.

Kommentarer

  • Det giver perfekt mening, tak!
  • Tak også for indsigten og det korrekte svar ( opstemt)

Svar

Faktisk for sådan streng sammenkædning (som er i en funktion, der kan kaldes meget ), dette kan resultere i hukommelsesfragmentering, og på de fleste Arduinos vil hukommelsen snart være spredt, så der ikke er noget nyttigt y er tilbage.

I stedet er det bedre at oprette en buffer på forhånd med den maksimale størrelse på den streng, du vil håndtere, som:

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

Og brug funktionen strcat eller strncat til sammenkædning af to strenge; der er generiske C-funktioner.

Kommentarer

  • Fair nok og generelt gode råd. Men jeg ' vil stadig gerne vide svaret på mit spørgsmål. 🙂
  • Jeg spekulerer på, hvilken fejl du får, når du bruger concat (kan ikke være en streng, der passerer fejl). Måske noget 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); 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *