Kuinka todella ketjuttaa kaksi merkkijonoa?

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); 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *