Guarda che l'int di Arduino è di due byte quindi +32767 .. -32768.
In ogni caso, i valori di ritorno NON è bene che siano dichiarati dinamicamente dentro la funzione (variabili che vengono rilasciate al momento dell'uscita) ... ti può andare bene e ti può andare male; ad esempio, con gli array di char (stringhe) ... va quasi sempre male
grazie però la devo richiamare su 4 strutture diverse
2 su scala temporale e 2 su scala angolare
Grazie ancora ... un'ultima cosa per avere il valore intero della variabile in C di solito utilizzo (int) ma ho notato che qui non posso causa dimensione ristretta ... forse (long) ?
La struttura e qualunque altro tipo puoi dichiararlo locale (quindi dentro una funzione) e poi restituirne il valore tramite return var;
Prima di distruggere la variabile ne viene fatta copia ed è questa che viene resistuita, le cose non stanno proprio cosi, ma non c'è rischio nel restituire una variabile locale.
Il problema si presenta invece restituendo un puntatore a dato locale, il quale viene distrutto e il puntatore restituito punta a nulla.
MauroTec:
La struttura e qualunque altro tipo puoi dichiararlo locale (quindi dentro una funzione) e poi restituirne il valore tramite return var;
Io non ho provato, ne sei sicuro ? Non usa un puntatore ?
MauroTec:
Il problema si presenta invece restituendo un puntatore a dato locale, il quale viene distrutto e il puntatore restituito punta a nulla.
Esatto, infatti con un byte/int/long funziona, ma per evitare problemi ... preferisco sempre dire di non farlo ...
Comunque, se si vuole dichiarare la variabile (di qualunque tipo) all'interno della funzione, basta dichiararla static ... così sopravvive e non c'è problema
gpb01:
Io non ho provato, ne sei sicuro ? Non usa un puntatore ?
Si, funziona con i compilatori C. A meno che il gcc, che viene chiamato da Arduino IDE, non "castri" qualcosa con qualche parametro. Ma questo esempio a me funziona:
Le strutture dovrebbero essere passate per valore come i tipi base del linguaggio (a quel che ricordo).
Nei libri infatti si suggerisce di usare i puntatori soprattutto se le struct sono "grosse", visto che un passaggio per valore implica anche delle copie "nascoste".
Se non ricordo male la struct con dentro una stringa è un trucco "sporco" per passare una stringa o array per copia ad una funzione. Logicamente se l'array è grosso... è una cosa da fessi.
Ricordo anche che la parola struct prima del nuovo "tipo" dichiarato è obbligatorio.
Questo non è valido: posizione ORA;
Questo si: struct posizione ORA;
Meglio usare un typedef:
typedef struct sPosiz
{ int ore, minuti, secondi;
} Posizione;
Posizione MyPos;
nid69ita:
Ricordo anche che la parola struct prima del nuovo "tipo" dichiarato è obbligatorio.
Questo non è valido: posizione ORA;
Questo si: struct posizione ORA;
Meglio usare un typedef:
typedef struct sPosiz[color=#222222][/color]
{ int ore, minuti, secondi;
} Posizione;
Posizione MyPos;
Quello che dici è vero in C, ma in C++ struct è praticamente un sinonimo di class (con la differenza che ha visibilità pubblica di default), per cui non serve il typedef e si può dichiarare una variabile (= un oggetto) senza metterci struct davanti.
Se non ricordo male la struct con dentro una stringa è un trucco "sporco" per passare una stringa o array per copia ad una funzione.
mmmm...a rigor di logica la cosa equivale a restituire un puntatore ad array locale non statico.
I registri interni dell'atmega non sono infiniti quindi per forza di cose le dichiarazioni locali finiscono nello stack.
Per ospitare un array dentro una struttura il membro deve essere di tipo puntatore.
Quando dichiari locale la variabile di tipo struct nello stack ci finisce l'array, quando restituisci la variabile per valore, viene fatta copia del puntatore, che però punta ad una porzione di memoria stack non più valida.
Mentre se l'array è dichiarato globale o static o dinamicamente la cosa deve funzionare. Se globale o static (di modulo o di funzione) il puntatore ad array punta ad un indirizzo stabilito a compile-time, se allocata dinamicamente il puntatore punta ad un indirizzo stabilito a run-time.
Quello che dici è vero in C, ma in C++ struct è praticamente un sinonimo di class (con la differenza che ha visibilità pubblica di default), per cui non serve il typedef e si può dichiarare una variabile (= un oggetto) senza metterci struct davanti.
Si si, proprio così, non lo dimentichiamo il compilatore invocato da Arduino è avr-cpp( preprocessore ) avr-g++ (compilatore) ed avr-ld come linker.
class in più ha anche, costruttori, distruttori, costruttori di copia e tante altre cose che provocano un gran mal di testa.
MauroTec:
class in più ha anche, costruttori, distruttori, costruttori di copia e tante altre cose che provocano un gran mal di testa.
Tutto questo lo puoi mettere anche in una struct. Davvero, struct == class, cambia solo la visibilità data di default ai membri, che è private per class e public per struct.
Tutto questo lo puoi mettere anche in una struct. Davvero, struct == class, cambia solo la visibilità data di default ai membri, che è private per class e public per struct.
Pure, non lo sapevo, quindi anche overload degli operatori?
Si ma il distruttore di struct come si fa?
Porca paletta, ho un solo cervello e tutto dentro non ci sta.