Tab Multiple

Ok va benissimo allora devo aggiustare un pó il mio codice.

Invece a proposito dell´errore che avevo prima? Non c´entra niente con questo vero?

Devo seguire il consiglio di Guglielmo?

astrobeed: è un limite, ma anche un errore, di come l'IDE compone il file da dare in pasto al compilatore.

Si, infatti non so cosa combini con il codice ma con questa storia [u]di voler creare lui i prototipi delle funzioni/u e di gestire lui le include ... è un casino ... :grin: XD :grin: XD

f.schiano: Devo seguire il consiglio di Guglielmo?

... puoi anche non seguirlo, ma tanto se non metti gli include nel .ino non ne esci ... ]:D ]:D ]:D

Guglielmo

ahahahah, non intendevo dire che non volevo seguire il tuo consiglio. Ma volevo sapere se era quella la soluzione al mio problema precedente. :)

Grazie mille per l´aiuto . Appena posso modifico il codice per averne uno piú pulito . Poi lo riposto cosí se avete tempo e vedete dei MACRO-ORRORI come mi ha fatto notare astrobeed continuo a fixarlo :) !

Grazie davvero, scappo al mio corso di tedesco, a stasera!

... comunque .. mettere le include risolve una parte dei problemi ... poi saltano fuori altri errori nel codice degli altri pezzi ... :roll_eyes:

Dovrai fare un po' di correzioni ... ;)

Guglielmo

Tutto questo si può riassumere così: l'IDE di Arduino non è fatto per strutturare il codice in questo modo ;)

leo72: l'IDE di Arduino non è fatto per strutturare il codice in questo modo ;)

Il modo di Fabrizio è sbagliato/incasinato a prescindere dall'IDE di Arduino, pure scrivendo il codice in C/C++, senza wiring, nel modo in cui l'ha strutturato il compilatore gli fa lo stesso le pernacchie :)

Non ho guardato il suo archivio... non mi permetto di commentare una cosa che non ho visto, per cui parlo solo delle "tab" dell'IDE. che più che tab multifile sono solo "rate" del programma principale ;)

Astro ha completamente ragione. Il mio codice é incasinatissimo . Purtroppo come ho detto non sono un esperto di C .

Penso che la cosa migliore sará scrivere direttamente il tutto sotto forma di libreria. Che ne pensate?

Con il file .h seguendo le istruzioni di astro e il file cpp con le implementazioni delle funzioni.

Fab.

Ho provato, probabilmente non nel modo giusto, a fare quello che mi ha detto astro e ho messo l´inizializzazione delle variabili che mi servono in una funzione:

initialize_sys(){.........}

nella void setup() come prima istruzione ci metto:

initialize_sys();

Ma poi se cerco di usare una variabile come "BaudRate" che sta nella mia funzione initialize_sys(){... BaudRate=115200;}

Il compilatore mi dice che la variabile non é definita.

EDIT: Sto dando un´occhiata a questo:

http://arduino.cc/en/Hacking/LibraryTutorial

Penso che leggendo questa pagina riesco a risolvere. :)

f.schiano: Ma poi se cerco di usare una variabile come "BaudRate" che sta nella mia funzione initialize_sys(){... BaudRate=115200;}

Premesso che per il baud rate sarebbe meglio usare una #define, così non sprechi ram, però se le variabili non le dichiari come globali non le vedrai mai all'interno di altre funzioni.

ok ma quindi tornando al concetto di libreria, per definire queste variabili globali e NON dovendo inserirle nel file .h , devo inserirle semplicemente nel file .cpp al di fuori di una funzione e non all´interno della funzione initialize_system() ?

f.schiano: ok ma quindi tornando al concetto di libreria, per definire queste variabili globali e NON dovendo inserirle nel file .h , devo inserirle semplicemente nel file .cpp al di fuori di una funzione e non all´interno della funzione initialize_system() ?

Tutte le variabili definite al di fuori di una funzione sono globali, se definite in un file diverso da quello in cui vengono utilizzate è necessario inserirle nell'header come "extern". Esempio nel file "a.c", o .cpp, definisci come globale "int variabile", per poterla utilizzare nel file "b.c" devi dichiararla, nel header, come "extern int variabile".

Ok. Ma allora cosa c´entra la funzione initialize_sys() ?

Non posso utilizzare una funzione per dichiarare delle variabili? Io in matlab lo faccio senza problemi richiamando una certa funzione ogni volta che apro un file. In C/C++ non c´é una cosa del genere?

f.schiano: Ok. Ma allora cosa c´entra la funzione initialize_sys() ?

Ti serve per caricare i valori iniziali nelle variabili e per settare opportunamente l'ambiente di funzionamento se necessario, ovviamente stiamo parlando di programmazione C/C++ fatta in modo corretto, nonché portatile, e non dell'ambiente distorto di wiring :) Se impari a programmare correttamente in C/C++ , ignorando le facilitazioni di wiring, hai solo da guadagnarci. Se scrivi un programma in C/C++ in modo corretto è molto semplice trasportarlo (porting) su altra piattaforma, dovrai sistemare solo la parte di interfaccia diretta con l'hardware perché sicuramente diversa tra i vari micro, il codice di Arduino gira solo su Arduino, ovvero solo per i pochi processori supportati, il che è un grosso limite.

Ok. Questo mi é chiaro.

Io vorrei un codice il piú pulito possibile che sia pulito a un osservatore C.

Il mio obiettivo é dichiarare ed inizializzare delle variabili, é meglio fare il tutto dove sta il setup() oppure da qualche altra parte.

Vorrei utilizzare il concetto di libreria che mi sembrava adatto allo scopo ma mi sembra di non aver capito bene come funziona.

Ho creato 2 file:

Degreen.h e Degreen.cpp

Te li allego cosí forse ci capiamo meglio.

Controller_v3_2.rar (11.1 KB)

f.schiano: Vorrei utilizzare il concetto di libreria che mi sembrava adatto allo scopo ma mi sembra di non aver capito bene come funziona.

Il mondo Arduino fornisce un concetto distorto di libreria, intanto tocca vedere se parliamo di C o C++, su i micro a otto bit il C++ è il male assoluto perché sciupone di risorse e porta facilmente ad errori "strani" dato che consente di riallocare la memoria con troppa disinvoltura, cosa che non è un problema su un pc dove di ram ne hai a tonnellate e ci sono meccanismi che la rilasciano in automatico quando non più utilizzata. In C una libreria è semplicemente una raccolta di funzione, più o meno complesse, mirate alla soluzione di un problema specifico, p.e. la gestione di un sensore, tipicamente una libreria è composta da uno, o più, file .c e un singolo file .h generale, quello che va incluso negli altri file del programma, ed eventualmente altri file .h abbinati ai vari file .c, come devono essere usati è gestito dal file .h principale. In C++ una libreria è un insieme di funzioni e/o di classi, stessa struttura della libreria C. Una enorme differenza tra il C e il C++ è che il primo consente di sapere al momento della compilazione l'esatto impegno di RAM, il che impedisce eventuali errori run time out of ram o straripamenti del heap space/stack.. Nel C++ puoi sapere solo l'impegno statico della RAM, dato che il C++ ti permette di creare oggetti con dimensioni variabili a piacere in modo dinamico, p.e. una "string", diventa possibile andare in out of ram o far straripare l'heap/stack mentre il programma gira, per non parlare del fatto che l'implementazione C++ di avrgcc è soggetta a svariati limiti.

Quindi la cosa migliore probabilmente é tenere il programma semplice in questo caso e definirmi le mie variabili prima del setup e abbandonare questa STRANA idea di libreria che forse non é la migliore idea in questo momento.

Che ne pensi?

Cerco di fare uno schema del progetto che ho in mente su un foglio con tutte le funzioni che devo implementare. Probabilmente aiuta.

non so quanto aiuti.

Ma ripeto il mio problema.

Ho tante funzioni che posso raggruppare in tante tabs perché ho le funzioni legate al DAC , le funzioni legate alla SD card etc.

Il problema ora é dove mettere l´inizializzazione delle variabili. All´inizio avevo pensato a un file .h perché viene compilato all´inizio (almeno credo).

Astro mi ha detto che non é il modo pulito di farlo e quindi ho cercato di virare verso la creazione di una libreria, ma probabilmente questa non é l´idea migliore. Quindi forse la soluzione é semplicemente aggiungere l´inizializzazione delle variabili in testa al file Controller_v3_2 dove c´é la funzione setup() e loop().

Cosa ne pensate?

proj.pdf (92.9 KB)

Se le funzioni che hai creato sono stabili e non necessitano di modifiche continue conviene pensare ad una libreria. Quanto detto equivale a dire: se le api sono stabili crea una libreria.

Sicuramente incontrerai alcune difficoltà a creare delle lib, spesso di tende ad usare variabili pubbliche dentro le funzioni, con le lib la variabile pubblica non sarà visibile e dovrai usare extern oppure passarla come parametro.

Purtroppo devi fare una scelta, ho complicarsi la vita usando le lib con tutti i vantaggi che porta, oppure continuare con le tab e fare a meno di header file che porta sia vantaggi che svantaggi.

Ciao.