Problema con #define

Ciao a tutti,

ho un un fastidioso problema con una #define. Devo parametrizzare la configurazione dei pin usati in una libreria.

Ho messo le #ifdef nella libreria e poi la #define nello sketch ma sembra non trovarla. Funziona bene se l'include nello sketch è un file header che contiene esso stesso le #ifdef (e poi la #define nello sketch). Il mio caso però è un pò più complesso perchè l'header arriva da una inclusione di inclusione. Per intenderci il file .h nello sketch include a sua volta un altro file .h che in include alla fine l'ultimo della catena contenente la #idef. Una catena fatta così non viene "risolta" in modo corretto ponendo la #define nello skecth... e non funziona nemmeno se metto la #define prima dell'inclusione del file header principale, per intenderci quello iniziale della catena.

Vi risultano buchi nel preprocessore che gestisce le #define nell'IDE

Grazie Ale

Così a naso (non avendo postato il codice... ;)) prova a mettere il #define dello sketch prima dell'inclusione delle librerie.

Si come ho scritto l’ho già fatto… addirittura l’ho messo come prima riga dello sketch (il file .h decine di righe dopo) … se n’è fregato altamente :slight_smile:

Ale

alexbn:
Ho messo le #ifdef nella libreria e poi la #define nello sketch ma sembra non trovarla

E non te la troverà mai perché le #define sono valide solo all’interno dello stesso file, devi usare un .h con tutte le define e includerlo nella libreria/e e/o in tutti i file di programma (.c, .pde, .ino) dove devi usare queste #define.

Ho fatto qualche ulteriore test…

In genere includo solo il file header principale e poi l’IDE risolve le altre dipendenze includendo tutti i file della catena. Ho quindi creato un “case test” minimale. Anche su questo si presenta lo stesso problema, ma riesco a risolverlo (solo sul case test) includendo in maniera esplicita tutti i file header della libreria, “anticipando” il lavoro del pre-processore. In questo modo (ma solo in questo ) la #define viene correttamente gestita.

Purtroppo però l’escamotage non funziona sul mio progetto … includendo tutti i file della catena .h non risolvo :frowning: mi da sempre un errore sull’inesistenza della #define.

Ale

In allegato il case test

BUGDEFINELIB.rar (511 Bytes)

BUGDEFINE.rar (261 Bytes)

astrobeed: E non te la troverà mai perché le #define sono valide solo all'interno dello stesso file

Uhmmm scusa ma normalmente le #define che metto nello sketch sono viste dal "primo livello" di .h incluso. In questo caso non vengono viste perchè gli .h si includono tra loro.

, devi usare un .h con tutte le define e includerlo nella libreria/e e/o in tutti i file di programma (.c, .pde, .ino) dove devi usare queste #define.

includerlo nella libreria non andrebbe bene perchè non avrei più una libreria valida per tutti gli sketch. Includere un .h nello sketch con solo queste #define dentro non ha funzionato.

La mia esigenza è semplice. Ho UNA libreria che però voglio usare su due sketch diversi. Sono destinati a due ardu diverse quindi lo scopo sarebbe mantenere una sola libreria e poter "riconfigurare" i pin direttamente dallo sketch dove dirgli ad es. #define ARDU_ETH o #define ARDU_MINI.

Grazie Ale

Bhè, è una cosa che già il core di Arduino fa, ad esempio, per le digitalWrite... Vai a vedere li... ;)

Nel core, però, troverai definizioni ai singoli micro e non alle schede Arduino.

Potresti crearti 2 configurazioni personalizzate del fili pins_arduino.h Poi crei 2 nuove board nel file board.txt e modifichi solo la parte relativa ai pin (nomescheda.build.variant=miaconfigurazionepin)

Io non l'ho mai fatto, ma teoricamente funzione. :sweat_smile:

Il problema è che senza queste modifiche la libreria non è portabile.

Apprezzo l'idea ma vorrei qualcosa che non richieda poi troppa memoria per ricordarsi cosa e come ho customizzato l'ambiente. Qualcosa che se sposto i file del progetto altrove vada sempre bene con qualsiasi installazione dell'IDE. Quindi qualcosa da ficcare nel folder dello sketch :) o meglio ancora come vorrei, nello sketch stesso. La cosa che non capisco è che il "case test" che ho allegato poco sopra funziona se includo esplicitamente i "sotto header" direttamente nello sketch. Sul mio bello pienotto di altro codice NO... non capisco da cosa possa dipendere e cosa possa c'entrare la presenza di altro codice...forse solo che l'IDE va più facilmente nel pallone? :)

Grazie Ale