Ik “gebruik de SPISlave-bibliotheek en ik heb het volgende codefragment:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
De compiler houdt echter niet van mijn string-aaneenschakeling:
/home/lars/sketch_apr01a/sketch_apr01a.ino: In lambda-functie: sketch_apr01a: 65: 12: fout: “const String” doorgeven als “dit” argument van “String & String :: operator + = (const String &) “negeert kwalificaties [-fpermissive] arg + = String ((char *) data);
Ik heb ook andere versies geprobeerd, met vergelijkbare resultaten:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Dus hoe schrijf ik dit ongebruikelijke operatie?
Reacties
- Grappig, op avr-g ++ is het ' prima (met waarschuwingen over opslag duur) , je legt de variabele arg op waarde vast, dus het heeft ' geen invloed op de variabele buiten de lambda-functie.
Antwoord
Je lambda legt arg
vast door middel van een kopie, wat zeker niet is wat je wilt. En aangezien het “niet de kwalificatie mutable
heeft, kunnen de vastgelegde parameters niet worden gewijzigd. Vandaar de compilatiefout.
Je zou de fout kunnen verhelpen door te kwalificeren de opname als mutable
, maar u zou dan de vastgelegde kopie van arg
wijzigen, niet de originele. De juiste oplossing zou zijn om de tekenreeks vastleggen door middel van verwijzing in plaats van vastleggen door middel van kopiëren. Zie Lambda-uitdrukkingen .
Maar ik ben het eens met Michel Keijzers dat Strings helemaal vermijden is een betere optie.
Opmerkingen
- Klopt volkomen, bedankt!
- Bedankt voor het inzicht en ook het juiste antwoord ( upvoted)
Antwoord
Eigenlijk voor een dergelijke aaneenschakeling van tekenreeksen (die zich in een functie bevindt die veel ), dit zou kunnen resulteren in geheugenfragmentatie, en bij de meeste Arduinos zal het geheugen snel te verstrooid zijn zodat er geen bruikbaar geheugen is y blijft staan.
In plaats daarvan is het beter om van tevoren een buffer aan te maken met de maximale grootte van de string die u wilt verwerken, zoals:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
En gebruik de functie strcat
of strncat
voor het samenvoegen van twee strings; er zijn generieke C-functies.
Opmerkingen
- Redelijk genoeg, en goed advies in het algemeen. Maar ik ' zou toch graag het antwoord op mijn vraag willen weten. 🙂
- Ik vraag me af welke fout je krijgt als je concat gebruikt (kan geen fout zijn door het doorgeven van een string). Misschien wat casten naar const.
Answer
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);