Pages: [1]   Go Down
Author Topic: Problemi con stringhe!!  (Read 309 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In questo modo sembra funzionare con continuità:   smiley-twist
Code:
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..
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21657
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Sr. Member
****
Karma: 4
Posts: 344
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21657
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da quello che ho letto sul tutorial delle stringhe l'istruzione
Code:
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  smiley-lol
Comunque grazie dei consigli  smiley-wink
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21657
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Da quello che ho letto sul tutorial delle stringhe l'istruzione
Code:
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  smiley-lol
Comunque grazie dei consigli  smiley-wink
Potresti darmi il link della pagina in cui hai trovato scritta questa cosa?
Logged


Galliate (NO) Italia
Offline Offline
Full Member
***
Karma: 0
Posts: 180
Sviluppo sistemi software PLC/DCS/SCADA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io uso semplicemente questo modo:

Code:
// 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 smiley-wink
Logged

kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

Pages: [1]   Go Up
Jump to: