Primo consiglio su Arduino evita come la peste nera bubbonica la classe String (esse maiuscola) porta inevitabilemente nel 99% dei casi a blocchi improvvisi e/o imprevisti.
Se definisci una funzione come char pippo() è normale che ti dia errore se nella return metti un tipo differente, nel tuo caso un oggetto String ma anche se fosse stato un int o un boolean poco cambiava.
Senza il codice suppongo che tu vaglia ritornarti una stringa (esse minuscola ovvero array di char) metre tu hai definito che pippo(9 deve tornare un solo (e solo uno) carattere.
Non puoi definire una funzione che ritorni direttamente un array di char, uan possibile soluzione al tuo problema è quello di definire una funzione che non ritorna nulla (void) e passare come parametro il puntatore all'array di char, lo definici prima di chiamare la funzione e dentro la funzione lo valorizzi,manipoli,svuoti,ecc. dopo la funzione puoi usarne il contenuto
Primo, abbandona le variabili "String" perché su Arduino possono provocare problemi di gestione della memoria (cerca nel forum troverai millemila thread che ne parlano). Devi usare le "char*" o "char []".
Secondo, se la funzione deve restituire una stringa non puoi definirla "char" (che rappresenta un SINGOLO carattere). E' per questo che ti dà quell'errore.
Se proprio vuoi usare le String (ma comunque NON te lo consiglio affatto) devi definire anche la funzione con String:
String pippo();
Per cui ora posta qui il codice che stai scrivendo e vediamo di darti una mano a convertire.
In realtà sto modificando una libreria che sever per gestire l'invio/ricezione di SMS con un Sim900A collegato sulla seriale.
Chi la ha scritta in alcuni punti ha usato la classe String, ad esempio definisce:
String textData="";
e leggendo la seriale (collegata al modulo Sim900A) crea l'output con
textData += inData; (inData viene da un Read() sulla seriale)
Quindi a questo punto ho bisogno di chiarirmi bene come gestire le stringhe con arduino... e le funzioni che non ritornato numeri ma stringhe...
Potete mandarmi qualche link didattico che spieghi le cose per bene?
Purtroppo ho programmato tanto in Clipper 5.2 (sono ormai anziano...) ed adesso spesso uso VBA dentro access ma non ho molta esperienza con il C... e il fatto di non poter avere delle variabili stringa mi confonde...
Grazie.
O anche suggerirmi un libro che esemplifica tutto in maniera ordinata?
Trovo libri su arduino che spiegano le cose "costruendo progetti" ma avrei bisogno di un approccio più sistematico...
apparentemente se io definissi una funzione del tipo
char * funzione(parametri) {
bla bla bla
}
la funzione restituirebbe un puntatore a carattere, che è una stringa di 'C'
purtroppo però l'area di memoria puntata dal puntatore sarebbe "liberata" appena si esce dalla funzione, lasciando 'invalido' il puntatore
una soluzione sarebbe una cosa del tipo:
void funzione (char * risultato, altri parametri){
bla bla bla
}
che si chiama dopo aver dichiarato una variabile stringa di 'C' che viene passata tra i parametri come indirizzo
pertanto il risultato rimane "vivo" dopo il termine della funzione
per una sorta di correttezza 'formale' si potrebbe fare:
char * funzione (char * risultato, altri parametri){
bla bla bla
return risultato;
}
che "formalmente" restituisce una stringa di 'C' mentre in realtà la stringa è già "viva" quando viene chiamata la funzione
Esistono altri metodi per far restituire una stringa ad una funzione, senzampassarla come argomento. Sapendo che la funzione deve essere di tipo char* i modi sono:
Il primo gioca sul fatto che la memoria occupata dalle variabili locali ad una funzione viene dichiarata libera alla loro fine, ma non svuotata del proprio contenuto. Di conseguenza potrei SENZA dichiarare variabili o chiamando funzioni che ne dichiarino, copiare il contenuto della stringa in un'altra pre esistente, teoricamente va bene.
Il secondo è dichiarare la stringa ritornata dalla funzione come statica, così facendo quella memoria non vieni mai dichiarata libera in quanto è necessario che mantenga lo stesso contenuto da una chiamata alla successiva della funzione. Di conseguenza io potrei, passando dal puntatore restituito dalla funzioni e non dal nome della stringa in quanto quello non esiste più comunque, utilizzare liberamente quello spazio.
Il terzo, infine, consiste nel dichiarare occupato lo spazio, all'interno della funzione, attraverso una malloc(). In questo caso lo spazio non verrà più dichiarato libero. Questo metodo risolve il problema di tutti i precedenti, ovvero che se io richiamassi due volte la funzione senza utilizzare il restituito della prima quel testo sarebbe perso, così teoricamente esiste un modo per ottenerlo comunque. Questo metodo ha, però, come controindicazioni la stessa della classe String, cioè l'abnorme consumo di memoria in quanto l'area occupata da una malloc() è sempre area nuova.
fabpolli:
Primo consiglio su Arduino evita come la peste nera bubbonica la classe String (esse maiuscola) porta inevitabilemente nel 99% dei casi a blocchi improvvisi e/o imprevisti.
Devo verificare bene, ma la libreria che sto cercando di modificare mi pare utilizzi a piene mani la classe String...
Quindi è probabile che debba riprendere dall'inizio... cercare nuovamente una libreria per il SIM900A che sia "snella" orientata alla gestione SMS e sufficientemente documentata...
Grazie a tutti!!!
PS L'alternativa sarebbe modificare la libreria che sto usando per eliminare i riferimenti alla classe String... ma per quanto mi riguarda sarebbe un bagno di sangue!
Silente:
Esistono altri metodi per far restituire una stringa ad una funzione, senzampassarla come argomento. Sapendo che la funzione deve essere di tipo char* i modi sono:
...
Non mi vengono in mente altri modi.
Beh se non si esagera, anche se è una cosa "sporca" (ma in piccole MCU come Arduino si fa per questioni di ottimizzazione a discapito dell'eleganza del codice) si può sempre definire una variabile globale e riempire quella, quindi la funzione resta "void" ed il valore di ritorno sarà nella variabile globale ad esempio: