Cum să concatenăm de fapt două șiruri?

Folosesc biblioteca SPISlave și am următorul fragment de cod:

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

Compilatorul nu-i place concatenarea șirului meu, deși:

/home/lars/sketch_apr01a/sketch_apr01a.ino: În funcția lambda: sketch_apr01a: 65: 12: eroare: trecând „const String” ca „acest” argument al „String & String :: operator + = (const String &) „discards califiers [-fpermissive] arg + = String ((char *) data);

Am încercat și alte versiuni, cu rezultate similare:

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

Deci, cum anume scriu acest lucru neobișnuit operațiune?

Comentarii

  • Amuzant, pe avr-g ++ este ' bine (cu avertismente despre durata magazinului). Oricum , capturați variabila arg după valoare, deci nu va afecta ' t afectarea variabilei în afara funcției lambda.

Răspuns

Lambda ta captează arg prin copiere, ceea ce cu siguranță nu este ceea ce dorești. Și întrucât nu are calificativul mutable, parametrii capturați nu sunt modificabili. Prin urmare, eroarea compilatorului.

Ați putea scăpa de eroare calificându-vă captura ca mutable, dar atunci veți modifica copia capturată a arg, nu cea originală. Soluția corectă ar fi să capturați șirul prin referință în loc să capturați prin copiere. A se vedea Expresii Lambda .

Dar apoi sunt de acord cu Michel Keijzers că evitarea șirurilor este o opțiune mai bună.

Comentarii

  • Are perfect sens, mulțumesc!
  • Vă mulțumim și pentru înțelegere și pentru răspunsul corect ( votat în sus)

Răspuns

De fapt, pentru o astfel de concatenare șir (care se află într-o funcție care poate fi numită mult ), acest lucru ar putea duce la fragmentarea memoriei, iar pe majoritatea Arduino-urilor, memoria va fi curând prea împrăștiată, încât să nu existe niciun memor util y este lăsat.

În schimb, este mai bine să creați în prealabil un buffer cu dimensiunea maximă a șirului pe care doriți să îl manipulați, cum ar fi:

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

Și utilizați funcția strcat sau strncat pentru concatenarea a două șiruri; există funcții C generice.

Comentarii

  • Destul de corect și sfaturi bune în general. Dar îmi ' încă îmi place să aflu răspunsul la întrebarea mea. 🙂
  • Mă întreb ce eroare obțineți atunci când utilizați concat (nu poate fi o eroare de operație String trecând). Poate că unele aruncări la const.

Răspuns

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *