Go Down

Topic: Passare una struttura ad un file .h o .cpp (Read 155 times) previous topic - next topic

oldmanenzo

Per mia deformazione mentale, sono abituato a scrivere il codice in relative classi di appartenenza, questo per avere codice piu facile da manutenzionare che un solo file .ino con 3000-4000 righe di programma e ritrovare tra tante righe la funzione che ti serve.
Detto questo se mi serve una variabile utilizzato solo in quella classe specifica la dichiaro nel file .h della classe e la utilizzo tranquillamente, se invece mi serve su piu moduli la dichiaro nel file .ino
e con extern la dichiaro anche nelle classi che mi serve
quindi se io uso
Code: [Select]
extern NexText txtTemp;
extern uint8_t currentpage;
extern uint8_t previouspage;
extern String pwd[NUM_PWD][2];
extern char buffer[100];
extern String fileconfig[NUM_CONFIG][2];

fin qui va tutto bene e le variabili dichiarate come extern nella classe vengono viste ed aggiornate senza nessun problema.
Quello che non riesco è la dichiarazione del prototipo nel file .h o .cpp della struttura
questo è quanto dichiarato nel file .ino
Code: [Select]
struct list_config{
uint32_t noAdr; //Defnisce i pin da leggere se non disabilitati
uint8_t modeAllarm; //0=Completo 1=Solo contatti 2= solo sensori
uint8_t timeallarm; //tempo che rimane attiva la sirena in allarme espresso in minuti
float temp_Normale; //Valore della temperatura di funzionamento in modalita normale
float temp_Euro; //Valore della temperatura di funzionamento in modalita risparmio
float temp_Notturna; //Valore della temperatura notturna
float temp_Antigelo; //Valore temperatura antigelo
float temp_Diff; //Valore differenziale termico
uint8_t program; //0=programma Giornaliero 1=programma Settimanale 2=Programma venerdi/sabato
uint8_t modalita; //0=inverno 1=estate
};

list_config config;



ho provato a dichiarare la struttura in oggetto in qualsiasi modo ma il compilatore mi da sempre errore e non so come fargliela vedere alla classe esterna.
Code: [Select]
//modi in cui ho cercato di dichiarare il prototipo
extern struct list_config config;
extern list_config config;
extern struct config;

ovviamente una sola dichiarazione per volta ma nella prima dichiarazione mi da questo errore

Display.h:19: note  forward declaration of struct list_config
   extern struct list_config config

nella seconda
Display.h: 19:8: error: 'list_config' does not name a type
   extern list_config config

e nella terza
Display.h: 19:15: error: a storage class can only be specified for objects and functions
   extern struct config

Non ditemi di passarla come puntatore perche sarebbe del tutto inutile, perche la classe in oggetto ha tutte funzioni che lavorano con il metodo dell'evento il quale viene generato da un display nextion e per tale motivo non posso dire al display quando genera l'evento touch press o touch release di infilare anche il puntatore alla struttura.
Chi mi aiuta a capire dove sbaglio nella dichiarazione del prototipo. Grazie a tutti


nid69ita

#1
Jan 21, 2019, 04:00 pm Last Edit: Jan 21, 2019, 04:02 pm by nid69ita
Secondo me
struct list_config{ ... };
è solo un prototipo e non una variabile, quindi non puoi dichiararlo extern

https://stackoverflow.com/questions/9749943/how-to-make-a-structure-extern-and-define-its-typedef
my name is IGOR, not AIGOR

oldmanenzo

il link che hai passato è stato molto interessante, in effetti mi ha risolto il problema.

crei un file header chiamato per esempio Strutture.h dove ci vai ad infilare la/le strutture del programma
includi il file Strutture.h nel file .ino e dichiari un puntatore di struttura in questo modo

config *newconfig;

e nelle classi che ti serve quella struttura includi il file .h e nella dichiarazione usi

extern config *newconfig;

per il momento non ho ancora provato a scrivere ma solo a compilare
ma se utilizzando l'accesso ai membri con -> me li mostra non so perche non dovrebbe
scrivere.
Grazie


Go Up