Problema compilazione, non rileva le schede

Ciao a tutti,
ho un problemino che a volte si presenta e a volte no.
Cerco di usare le schede per mantenere 'pulito' lo sketch , organizzandole giustamente per funzioni che mi semplificano la lettura o la ricerca errori . qualche volta però, avvio ardunoIDE, apro lo sketch, compilo, e ricevo errori 'was not declared in this scope'.
Se sposto la funzione della scheda nella scheda pricipale, allora va. Cancello la scheda, la ricreo, ricopio la funzione nella scheda e funziona.
A volte mi basta un riavvio del computer e funziona di nuovo.
Chiedo: c'è un'impostazione che abilita o disabilita la lettura delle schede? A parte il riavvio del pc, cosa puo essere a creare il problema? sono sotto ubuntu.
grazie

Versione IDE ?

Formalmente se scrivi per moduli (le tue "schede") si dovrebbe inserire in testa il "prototipo" delle sue funzioni.
Al compilatore di Arduino generalmente non interessa perché se anche definisci una funzione DOPO il punto in cui la usi, ci pensa lui a "vedere" il prototipo direttamente dalla funzione stessa.

Non potendo vedere il tuo codice (magari se ci postassi qualche esempio...) immagino che nel tuo caso credo che sia perché questo "prototipo automatico" non agisca globalmente per tutto il progetto ma solamente per ogni singolo modulo/file.

Se è questo il problema, allora prova a crearti un tuo ".h" nel quale metti i prototipi di tutte le funzioni degli altri moduli, e mettilo in include all'inizio del modulo principale.

wipity:
A volte mi basta un riavvio del computer e funziona di nuovo.

Questa mi pare strana...

nid69ita :

versione IDE 1.8.7

docdoc :

moduli (le tue "schede")

giusto(!), non mi ricordavo!! :neutral_face:

comunque, allego una piccola parte dello sketch per esp32 che sto usando e che fino a ieri sera, senza altre modifiche , compilava correttamente. L' esempio che posto non compila, mancano variabili e definizioni, in breve : uso una libreria menu, un lcd con shift register e 4 pulsanti (collegati allo shift register) per avviare un programma specifico di una apparecchiatura o entrare in un menu di configurazione.
Il modulo che posto( ce ne sono altri 6, uno per la gestione delle uscite del programma scelto, gli altri sono task che lavorano con millis(), invio post, connessione wifi,ecc).

mi ritrovo ad esempio l'errore su 'a = readButton();' , ma anche in riferimento ad altri moduli che ho omesso.

Se sposto la funzione 'readButton()' dopo il loop , riprende a funzionare...

Quote from: wipity on Today at 01:24 pm
A volte mi basta un riavvio del computer e funziona di nuovo.
Questa mi pare strana...

lo so, non sempre basta, spesso devo portare tutte le funzioni nello sketch principale e poi cancellare e ricreare le schede...

questo "prototipo automatico" non agisca globalmente per tutto il progetto ma solamente per ogni singolo modulo/file.

mi puoi spiegare questo?
grazie

esempio_moduli.ino (3.48 KB)

readButton.ino (1.61 KB)

wipity:
mi ritrovo ad esempio l'errore su 'a = readButton();' , ma anche in riferimento ad altri moduli che ho omesso.
Se sposto la funzione 'readButton()' dopo il loop , riprende a funzionare...

Scusa ma io ho infatti detto di fare "un tuo ".h" nel quale metti i prototipi di tutte le funzioni degli altri moduli, e mettilo in include all'inizio del modulo principale". Se non lo fai, temo che il problema che sto immaginando continui a venir fuori.

Quindi come prima prova, almeno per la readButton(), a riga 2 metti il suo prototipo ossia:

int readButton();

e vedi se la compilazione si incazza ancora per la readButton()....

Se non lo fa, significa che è quello per cui devi fare ciò che dicevo, ossia prendi TUTTI i prototipi delle funzioni degli altri moduli, mettili in un tuo "MieFunzioni.h" e poi a riga 2 mettici
#include "MieFunzioni.h" e vedi se va tutto.

mi puoi spiegare questo?

Quello che dicevo, ovvero se definisci la readButton() in un altro file, lui compila prima il programma principale e poi gli altri, ma dato che in quello principale non "vede" alcuna funzione readButton() si incazza. Per fargliela "vedere" devi dargli almeno il prototipo.

ok, non avev capito, tra un po' provo.
intanto grazie :slight_smile: