Go Down

Topic: Problema con #define (Read 505 times) previous topic - next topic

alexbn

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

Janos

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

alexbn

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 :)

Ale

astrobeed


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.
Usare il GOTO in C è ammettere la propria sconfitta come programmatore

alexbn

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 :( mi da sempre un errore sull'inesistenza della #define.

Ale

In allegato il case test

alexbn


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.

Quote
, 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

Janos

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.

PaoloP

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.  :smiley-sweat:

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

alexbn

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

Go Up