Go Down

Topic: Problemi con stringhe!! (Read 426 times) previous topic - next topic

garrard08

Salve, ho un problema che non riesco proprio a spiegarmi. Ecco il codice incriminato:
Code: [Select]
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.  ;) I problemi si presentano quando voglio far ritornare il vettore di char una stringa:  :smiley-roll-sweat:
Code: [Select]
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?  :smiley-eek:

garrard08

In questo modo sembra funzionare con continuità:   ]:D
Code: [Select]
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..

leo72

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à.

yoshi93

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

leo72

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.

garrard08

Da quello che ho letto sul tutorial delle stringhe l'istruzione
Code: [Select]
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  ;)

leo72


Da quello che ho letto sul tutorial delle stringhe l'istruzione
Code: [Select]
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  ;)

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

kattivik76

Io uso semplicemente questo modo:

Code: [Select]

// 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 ;)
kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

Go Up