Jak właściwie połączyć dwa ciągi?

Używam biblioteki SPISlave i mam następujący fragment kodu:

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

Kompilator nie lubi jednak mojej konkatenacji ciągów:

/home/lars/sketch_apr01a/sketch_apr01a.ino: W funkcji lambda: sketch_apr01a: 65: 12: error: przekazanie „const String” jako „this” argumentu „String & String :: operator + = (const String &) „odrzuca kwalifikatory [-fpermissive] arg + = String ((char *) data);

Próbowałem też innych wersji z podobnymi wynikami:

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

Więc jak dokładnie mam napisać to niezwykłe operacja?

Komentarze

  • Zabawne, na avr-g ++ to ' w porządku (z ostrzeżeniami o czas trwania sklepu) , przechwytujesz zmienną arg według wartości, więc ' nie wpłynie na zmienną poza funkcją lambda.

Odpowiedź

Twoja lambda przechwytuje arg przez kopię, co z pewnością nie jest tym, czego chcesz. A ponieważ nie ma kwalifikatora mutable, przechwyconych parametrów nie można modyfikować. Stąd błąd kompilatora.

Możesz pozbyć się błędu, kwalifikując przechwytywania jako mutable, ale wtedy zmodyfikowałbyś przechwyconą kopię arg, a nie oryginalną. Prawidłowym rozwiązaniem byłoby przechwytywanie String przez odniesienie zamiast przechwytywania przez kopię. Zobacz Wyrażenia lambda .

Ale zgadzam się z Michelem Keijzersem, który całkowicie unikał Stringsów to lepsza opcja.

Komentarze

  • To ma sens, dziękuję!
  • Dziękuję za wgląd i poprawną odpowiedź ( upvoted)

Odpowiedź

Właściwie dla takiej konkatenacji ciągów (która jest funkcją, którą można nazwać dużo ), może to spowodować fragmentację pamięci, aw większości Arduino pamięć zostanie wkrótce zbyt rozproszona, aby nie było przydatnej pamięci y jest na lewo.

Zamiast tego lepiej jest wcześniej utworzyć bufor z maksymalnym rozmiarem ciągu, który chcesz obsłużyć, na przykład:

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

I użyj funkcji strcat lub strncat do łączenia dwóch ciągów; istnieją ogólne funkcje C.

Komentarze

  • W porządku i ogólnie dobra rada. Ale ' nadal chciałbym poznać odpowiedź na moje pytanie. 🙂
  • Zastanawiam się, jaki błąd otrzymujesz podczas używania concat (nie może to być błąd operacji przekazywania ciągu znaków). Może jakieś rzutowanie na stałą.

Odpowiedź

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *