Käytän SPISlave-kirjastoa, ja minulla on seuraava koodinpätkä:
String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }
Kääntäjä ei kuitenkaan pidä merkkijononi ketjutuksesta:
/home/lars/sketch_apr01a/sketch_apr01a. :: operaattori + = (const String &) ”hylkää karsinnat [-fpermissive] arg + = String ((char *) data);
Olen kokeillut myös muita versioita, samankaltaisilla tuloksilla:
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
Joten miten kirjoitan tämän epätavallisen toiminto?
Kommentit
- Hauska, avr-g ++: lla se ' s hienosti (varoituksineen) myymälän kesto) , sieppaat arg-muuttujan arvon mukaan, joten se ei vaikuta ' t vaikuttamaan lambda-funktion ulkopuolella olevaan muuttujaan.
Vastaa
Lambdasi sieppaa arg
-kopion, mikä ei todellakaan ole sitä mitä haluat. Ja koska sillä ei ole mutable
-merkintää, siepattuja parametreja ei voi muokata. Siksi kääntäjävirhe.
Voit päästä eroon virheestä pätevöitymällä sieppaus nimellä mutable
, mutta muokkaat sitten arg
: n siepattua kopiota, ei alkuperäistä. Oikea ratkaisu olisi siepaa merkkijono viitteellä kopioinnin sijaan. Katso Lambda-lausekkeet .
Olen kuitenkin samaa mieltä Michel Keijzersin kanssa siitä, että merkkijonoja vältetään kokonaan. on parempi vaihtoehto.
Kommentit
- On järkevää, kiitos!
- Kiitos myös oivalluksesta ja oikeasta vastauksesta ( äänestetty)
Vastaa
Oikeastaan tällaiselle merkkijonon ketjutukselle (joka on funktiossa, jota voidaan kutsua paljon ), tämä voi johtaa muistin pirstoutumiseen, ja useimmissa Arduinoissa muisti hajoaa pian liian hajallaan y on jäljellä.
Sen sijaan on parempi luoda etukäteen puskuri, jonka maksimikoko on käsiteltävä merkkijono, kuten:
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
Ja käytä funktiota strcat
tai strncat
kahden merkkijonon ketjutukseen; on olemassa yleisiä C-toimintoja.
Kommentit
- Riittävän oikeudenmukainen ja yleisesti ottaen hyviä neuvoja. Mutta ' haluan silti tietää vastauksen kysymykseeni. 🙂
- ihmettelen, minkä virheen saat käytettäessä concatia (ei voi olla merkkijonon ohitusvirhe). Ehkä joku suoratoistona const: iin.
Vastaa
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);