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:
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?
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
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
Potresti darmi il link della pagina in cui hai trovato scritta questa cosa?