Problemi con stringhe!!

Salve, ho un problema che non riesco proprio a spiegarmi. Ecco il codice incriminato:

char *app = (char*) malloc (30*sizeof(char));
         bufferRead.toCharArray(app, bufferRead.length());
         enDecrypt(app, key, bufferRead.length());

Praticamente trasformo una stringa in un array di char (denominato app) per poter effettuare su di esso delle operazioni, e passo app per riferimento. Le operazioni vanno a buon fine, e se ristampo app dopo la chiamata a funzione presenta lo stato desirato. :wink: I problemi si presentano quando voglio far ritornare il vettore di char una stringa: :cold_sweat:

String packetReceived(app);

Spesso l'arduino si pianta su questa riga. Se aggiungo delle stampe per fare dei test la creazione della stringa funziona, ma se le tolgo dopo un pò il programma inizia a ripiantarsi su questa riga..
qualcuno sa se ha un senso questa cosa? :astonished:

In questo modo sembra funzionare con continuità: ]:smiley:

String packetReceived = "";
         for (int i=0;i<30;i++)
           packetReceived += app[i];

anche se continuo a non capire perchè il metodo con il costruttore dà più problemi che stringhe..

Che IDE usi?
Fino alla 1.0.3 la funzione malloc (che non è supportata nativamente dal compilatore ma era stata aggiunta dal core di Arduino) era buggata. Ci vuole minimo la 1.0.4.

A questo aggiungi che la gestione delle stringhe sull'Arduino è un pò incasinata e l'unico modo per non far piantare il chip per un overflow di memoria SRAM è quello di dichiarare una stringa non vuota (cioè con String stringa = "") ma dandole la dimensione massima dei dati che dovrà contenere e poi riempiendola secondo necessità.

Secondo me poi l'utilizzo è sbagliato. Al posto di: String packetReceived(app); non dovrebbe fare una cosa del tipo: String ret = packetReceived(app); ?

Sì, effettivamente quell'istruzione è ambigua.
Forse l'ha trascritta a mano e non copia-e-incollata, e potrebbe essere un errore. Si può infatti intendere come funzione packetReceived che lavora su "app" e restituisce una stringa ma anche come assegnazione di "app" a qualcosa. Sarebbe da vedere tutto il codice.

Da quello che ho letto sul tutorial delle stringhe l'istruzione

String packetReceived(app);

dovrebbe andare bene. Non rappresenta una chiamata a procedura, ma un costruttore per creare una stringa chiamata packetReceived da un array di char.. però a volte funziona, altre il codice si pianta li. Almeno adesso so che devo evitarla XD
Comunque grazie dei consigli :wink:

garrard08:
Da quello che ho letto sul tutorial delle stringhe l'istruzione

String packetReceived(app);

dovrebbe andare bene. Non rappresenta una chiamata a procedura, ma un costruttore per creare una stringa chiamata packetReceived da un array di char.. però a volte funziona, altre il codice si pianta li. Almeno adesso so che devo evitarla XD
Comunque grazie dei consigli :wink:

Potresti darmi il link della pagina in cui hai trovato scritta questa cosa?

Io uso semplicemente questo modo:

// our command string
//===================
# define COMMANDSIZE 128
char GWord[COMMANDSIZE];

// move with G1 + feedrate in freerun (max distance -3mt)
sprintf(GWord, "G1 X-3000 F%4.1f", pot_feedrate, " :");

GWord conterrà per esempio, "G1 X-3000 F500.3 :" ed è un array char di lunghezza 18 anche se l'array dichiarato è 128 :wink: