Hogyan lehet valójában összefűzni két húrt?

A SPISlave könyvtárat használom, és a következő kódrészletem van:

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

A fordító azonban nem szereti a karaktersorozatom összefűzését:

/home/lars/sketch_apr01a/sketch_apr01a.ino: A lambda függvényben: sketch_apr01a: 65: 12: hiba: a “string String” átadása a “String & karakterlánc ezen argumentumaként :: operátor + = (const String &) “eldobja a minősítőket [-fpermissive] arg + = String ((char *) adatok);

Megpróbáltam más verziókat is, hasonló eredménnyel:

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

Szóval hogy is írjam pontosan ezt a szokatlant művelet?

Megjegyzések

  • Vicces, az avr-g ++ esetén ez ' s rendben (figyelmeztetésekkel bolt időtartama) .Mindegy , az arg változót érték szerint rögzíted, így az nem fogja befolyásolni a lambda függvényen kívüli változót.

Válasz ' h2>

A lambda másolattal rögzíti a arg t, ami egészen biztosan nem az, amire vágysz. És mivel nincs “mutable minősítője, a rögzített paraméterek nem módosíthatók. Ezért a fordító hibája.

A minősítéssel megszabadulhat a hibától. a rögzítést mutable néven, de akkor a arg rögzített másolatát módosítanád, nem az eredetit. A helyes megoldás az lenne, ha rögzítse a karakterláncot hivatkozással, másolás helyett. Lásd: Lambda kifejezéseket .

De akkor egyetértek Michel Keijzers-szel, hogy a karakterláncok teljes kerülése jobb lehetőség.

Megjegyzések

  • Teljesen értelmes, köszönöm!
  • Köszönjük a betekintést és a helyes választ is ( szavazott)

Válasz

Tulajdonképpen egy ilyen karakterlánc összefűzéshez (amely egy olyan funkcióban van, amelyet soknak lehet nevezni ), ez a memória töredezettségét eredményezheti, és a legtöbb Arduinos esetében a memória hamarosan szétszóródik, így nincs hasznos memória y maradt.

Ehelyett jobb, ha előre létrehoz egy puffert a kezelni kívánt karakterlánc maximális méretével, például:

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

És használja a strcat vagy strncat függvényt két húr összefűzéséhez; vannak általános C funkciók.

Megjegyzések

  • Elég tisztességes és általában jó tanács. De ' még mindig szeretném tudni a választ a kérdésemre. 🙂
  • Kíváncsi vagyok, milyen hibát tapasztalsz a concat használatakor (nem lehet String átengedési műveleti hiba). Lehet, hogy valami casting a const-ba.

Válasz

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük