Go Down

Topic: Problemi con stringhe!! (Read 462 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy