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