Jak vlastně zřetězit dva řetězce?

Používám knihovnu SPISlave a mám následující fragment kódu:

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

Kompilátor se mi však nelíbí moje zřetězení řetězců:

/home/lars/sketch_apr01a/sketch_apr01a.ino: Ve funkci lambda: sketch_apr01a: 65: 12: error: passing „const String“ as „this“ argument of „String & String :: operator + = (const String &) „zahodí kvalifikátory [-fpermissive] arg + = String ((char *) data);

Vyzkoušel jsem i jiné verze s podobnými výsledky:

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

Jak přesně tedy napíšu tento neobvyklý provoz?

Komentáře

  • Zábavné, na avr-g ++ je to ' v pořádku (s upozorněním na trvání obchodu). Každopádně , zachycujete proměnnou arg podle hodnoty, takže ' neovlivní proměnnou mimo funkci lambda.

Odpovědět

Vaše lambda zachycuje arg kopií, což rozhodně není to, co chcete. A protože nemá kvalifikaci mutable, zachycené parametry nelze měnit. Proto chyba kompilátoru.

Chybu byste se mohli zbavit kvalifikací zachycení jako mutable, ale pak byste upravovali zachycenou kopii arg, ne původní. Správným řešením by bylo zachytit řetězec pomocí odkazu namísto zachycení kopií. Viz výrazy Lambda .

Ale potom souhlasím s Michelem Keijzersem, který se úplně vyhýbá řetězcům je lepší volba.

Komentáře

  • Dává perfektní smysl, díky!
  • Děkujeme také za pochopení a správnou odpověď ( upvoted)

Odpověď

Vlastně pro takové zřetězení řetězců (které je ve funkci, kterou lze hodně nazvat) ), mohlo by to mít za následek fragmentaci paměti, na většině Arduinos bude paměť brzy příliš rozptýlená, že žádná užitečná paměť y je ponecháno.

Místo toho je lepší předem vytvořit vyrovnávací paměť s maximální velikostí řetězce, který chcete zpracovat, například:

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

A použijte funkci strcat nebo strncat ke zřetězení dvou řetězců; existují generické funkce C.

Komentáře

  • Dost spravedlivé a obecně dobrá rada. Ale ' stále chci znát odpověď na mou otázku. 🙂
  • Zajímalo by mě, jakou chybu dostanete při použití concat (nemůže to být chyba operace předávání řetězce). Možná nějaké obsazení do konst.

Odpovědět

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *