Tab vs .h

sono abituato ad usare i tab dell'ide arduinica per suddividere le varie parti di un programma, o le funzioni piu' lunghe di un programma dal resto del codice.
Ho visto pero' che alcuni invece creano proprio dei file.h, che poi vengono dichiarati tramite Include come le librerie.
Quale e' il vantaggio ? con il semplice uso delle tab non devo includere nulla.

E la riutilizzabilità del codice dove la metti ??? :grin:

Guglielmo

Non credo c'entri, perche' anche con le tab vengono creati diversi file.ino che se voglio posso usare pari pari in altri sketch

Ma i files .ino non sono uno standard del C ... i .h SI :slight_smile:

Se scrivi del software in C riutilizzabile (... e per quel che mi riguarda ... vendibile $) ... si, sono venale) non puoi mica legarti ai .ino devi usare ciò che è standard, i .c/.cpp ed i .h ...

Inoltre, con i .ino, ti precludi tutte le posibilità di inclusioni condizionali e quant'altro ...
... insomma sei limitato ad un ambiente di sviluppo e limitato su ciò che puoi fare ... :roll_eyes:

Guglielmo

ad esempio in un .h ho due classi, credo voglia significare che e' scritto in c++, una classe posso comunque usarla con il C arduinico ?
Volendo convertire tutto in tab .ino posso farlo ?
E' questione solo di abitudine ?

Il discorso è più complesso.

Un tab altro non è che una porzione dello sketch separata dal resto del codice e messa per "comodità" in un'altra linguetta. In questo modo puoi organizzare un file dividendo ad esempio le routine di input da quelle di input da quelle di gestione della seriale da quelle di gestione degli interrupt ecc.
Ma alla fine di tutto, quando vai a compilare, l'IDE riunisce tutto in un unico sketch e poi passa il file al compilatore.

Un file .h incluso con un'include viene invece incluso durante la compilazione e le funzioni che contiene diventano disponibili al programma. Come ti ha detto Guglielmo, se sono funzioni generiche, cioè funzioni di una tua personale libreria che usi molto in diversi programmi, conviene farti l'h perché così tieni quel file in unica copia e lo includi secondo necessità. Un file .ino invece lo devi copiare all'interno di ogni cartella di ogni sketch in cui vuoi usarlo. Diventa un pò pa......so :smiley:

grazie dei chiarimenti ad entrambi
se non sbaglio lessi tempo fa un consiglio che diceva di mettere in un .h la dichiarazione delle variabili di un progetto e poi includerle. In questo caso quale e' il vantaggio visto che quelle variabili saranno usate solo in quel progetto ?

per curiosita' leo, visto che le tab vengono riunite prima della compilazione, viene scritto anche un .ino globale da qualche parte o e' temporaneo e viene cancellato ?

Un ultima domanda, visto che si puo' scrivere un .h per una determinata funzione, ad esempio per gestire il nunchuk posso trovare un .h appositamente scritto, quale e' la differenza con una libreria ? e' solo una scelta personale oppure con un .h non si puo' fare tutto quello che fai con una libreria ?

Testato:
grazie dei chiarimenti ad entrambi
se non sbaglio lessi tempo fa un consiglio che diceva di mettere in un .h la dichiarazione delle variabili di un progetto e poi includerle. In questo caso quale e' il vantaggio visto che quelle variabili saranno usate solo in quel progetto ?

Non so. Forse perché in questo modo tutte le var globali le riunisci così in cima al programma. Ricorda che una var globale non lo è proprio del tutto :sweat_smile: Dipende dove la posizioni: essa è visibile SOLO a tutte le funzioni che le vengono dopo, per cui se infili la dichiarazione di una var globale tra setup e loop, ad esempio, essa NON sarà visibile al setup perché lo segue.

per curiosita' leo, visto che le tab vengono riunite prima della compilazione, viene scritto anche un .ino globale da qualche parte o e' temporaneo e viene cancellato ?

Nella cartella temporanea che l'IDE crea quando apri uno sketch. Lì viene anche ricreato il file cpp che poi viene passato al compilatore. Quando chiudi la finestra dell'IDE che ha creato quella cartella, essa viene eliminata con tutto il suo contenuto.
Attiva la compilazione verbosa per avere il suo path.

Un ultima domanda, visto che si puo' scrivere un .h per una determinata funzione, ad esempio per gestire il nunchuk posso trovare un .h appositamente scritto, quale e' la differenza con una libreria ? e' solo una scelta personale oppure con un .h non si puo' fare tutto quello che fai con una libreria ?

Ci sono alcune differenze. Ad esempio, per le prime versioni della mia swRTC avevo creato la classica libreria con file .h e .cpp.
L'ultima, se vedi, ha solo un file .h.

Questo è dovuto al fatto che volevo un meccanismo per evitare di far "spippolare" il codice all'utente per attivare il supporto alla periferica Real-Time Counter del timer 2 (per usare il quarzino da 32 Khz esterno), solo che una #define messa prima dell'#include era vista solo all'interno del file .h ma io avevo la necessità di passarlo anche al file .cpp. Da qui la scelta obbligata di riunire tutto il codice nel file header.

ma viene sempre inclusa come libreria giusto ? cioe' non e' che il .h appare in una tab dell'ide.
Potrei anche non installare la libreria ed includere il solo .h in una tab ?

Test ...
... ricorda che quelle di Arduino sono "finte" librerie ... in verità sono dei pacchetti sorgenti che vengono compilati assieme al tuo programma.

Le vere librerie sono pre-compilte e il produttore ti vende solamente il codice oggetto (la libreria ... immagina sotto Win, ad esempio, una .dll)) e il .h che occorre al compilatore per il controllo sintattico e per creare le referenze che serviranno poi al linker a risolvere le varie chiamate :wink:

Guglielmo

Testato:
ma viene sempre inclusa come libreria giusto ? cioe' non e' che il .h appare in una tab dell'ide.
Potrei anche non installare la libreria ed includere il solo .h in una tab ?

Se la metti in /libraries, la includi come fosse una lib (con tutte le disquisizioni sul termine "libreria" che ti ha spiegato Guglielmo :wink: ).
Ma se lo metti come tab, il compilatore ti copia il file all'interno della cartella del tuo progetto e diventa un file che fa parte solo di quel progetto. Poi devi togliere l'include iniziale perché altrimenti viene incluso 2 volte e si torna al discorso che ti facevo prima, ossia che se includi qualcosa come tab fa parte solo di quello sketch e devi copiarlo in tutti gli sketch in cui vuoi usare quel file mentre se lo lasci in /libraries lo puoi includere da ogni sketch avendone sul computer 1 sola copia (=facilità di manutenzione e aggiornamento)

grazie raga, ora ho le idee piu' chiare,
piu' karma per tutti :slight_smile:

Chi ha vinto: la tab o l'h?