Oggi ho aggiornato la ide alla nuova versione 1.8.7. Provenivo da 1.8.5, lo sketch che prima compilava e caricava ora mi restituisce un errore sullo scope di un tipo struct. tra l'altro è lo stesso identico errore che mi dava stino con Sublime Text quindi comincio a pensare che possa essere un errore di sintassi. O un bug?
Allego sketch (è un po' disordinato perchè è costantemente in modifica) potreste provare a vedere se vi da lo stesso errore? grazie
errore generato da SublimeText e Stino
[Build] G:/Arduino/TAFFY/TAFFY_V1.3...
[Step 1] Check Toolchain.
[Step 2] Find all source files.
[Step 3] Start building.
[2.9%] Compiling TAFFY_V1.3.ino.cpp...
G:/Arduino/TAFFY/TAFFY_V1.3/TAFFY_V1.3.ino:65:19: error: 'ricetta' was not declared in this scope
^
G:/Arduino/TAFFY/TAFFY_V1.3/TAFFY_V1.3.ino: In function 'void termostato()':
G:/Arduino/TAFFY/TAFFY_V1.3/TAFFY_V1.3.ino:596:42: error: 'selectricetta' cannot be used as a function
int scelto = selectricetta(ricettario);
^
G:/Arduino/TAFFY/TAFFY_V1.3/TAFFY_V1.3.ino: In function 'int selectricetta(ricetta*)':
G:/Arduino/TAFFY/TAFFY_V1.3/TAFFY_V1.3.ino:640:32: error: 'int selectricetta(ricetta*)' redeclared as different kind of symbol
int selectricetta(ricetta ric[]) {
^
G:/Arduino/TAFFY/TAFFY_V1.3/TAFFY_V1.3.ino:65:5: note: previous declaration 'int selectricetta'
^
[Build] Error occurred.
errore generato da ide Arduino 1.8.7
Arduino:1.8.7 (Windows 7), Scheda:"Arduino Nano, ATmega328P"
TAFFY_V1.3:640:19: error: 'ricetta' was not declared in this scope
int selectricetta(ricetta ric[]) {
^
G:\Arduino\TAFFY\TAFFY_V1.3\TAFFY_V1.3.ino: In function 'void termostato()':
TAFFY_V1.3:596:42: error: 'selectricetta' cannot be used as a function
int scelto = selectricetta(ricettario);
^
G:\Arduino\TAFFY\TAFFY_V1.3\TAFFY_V1.3.ino: In function 'int selectricetta(ricetta*)':
TAFFY_V1.3:640:32: error: 'int selectricetta(ricetta*)' redeclared as different kind of symbol
int selectricetta(ricetta ric[]) {
^
G:\Arduino\TAFFY\TAFFY_V1.3\TAFFY_V1.3.ino:640:5: note: previous declaration 'int selectricetta'
int selectricetta(ricetta ric[]) {
^
exit status 1
'ricetta' was not declared in this scope
Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"
nel frattempo ho provato con la versione 1.8.5 e me la compila senza nessun errore.
ho reinstallato su un secondo pc la versione nuova e mi ripropone l'errore suddetto.
Non so veramente cosa fare. Vorrei anche capire ma mi sembra proprio un errore così assurdo.
Come mai la 1.8.5 lo compili è da capire, comunque la sintassi, in 'C', non è corretta ...
dichiari una struct di nome "ricetta"
se vuoi dichiare delle variabili che hanno quella struttura, la sintassi corretta è:
"structnome_strutturanome_variabile"
Quindi, davati a "ricettario" e "ric" va messo "struct ricetta" e NON solo "ricetta". Dai anche un'occhiata QUI e, se lo hai, leggiti il capitolo "6 - Structures" del "Kernighan e Ritchie" (... la Bibbia del C).
... nel caso del C++, in alcuni casi, si può omettere la parola "struct" (... che comunque sarebbe sempre da mettere) ... ma io sono un "ANSI C" e per le spiegazioni sul C++ lascio la parola a SukkoPera.
L'unica cosa che ho trovato è la seguente:
Syntactically both treat struct almost the same. Only C++ has added an extra rule that allows to omit the struct (and class) keyword if there is no ambiguity.
If there is ambiguity, also C++ requires the struct keyword in some places. A notorious example is stat on POSIX systems where there is a struct stat and a function stat.
Probabilmente la versione del compilatore nella 1.8.7 ... adotta canoni più restrittivi ... :
SukkoPera:
Infatti, ho detto che forse avevo scritto una vakkata proprio perché mi sono reso conto che siamo in C++ e quindi la keyword struct non è necessaria.
Da quanto ho visto non è sempre obbligatoria, come in C, ed, in casi senza ambiguità, si può omettere ... ma non è che non è necessaria, anzi, consigliano di metterla sempre, se non altro per chiarezza
Mi sa che sei incappato in un bug del builder di Arduino 1.8.7 . Pare che questo, quando estrae i prototipi delle funzioni li inserisca in testa al file, prima che i tipi di dato siano definiti, ecco perché "ricetta" risulta sconosciuto.
L'1.8.5 invece li inserisce appena prima del setup(), quanto i tipi sono già definiti.
SukkoPera:
Mi sa che sei incappato in un bug del builder di Arduino 1.8.7 . ...
... continuno a dire che, dato che non fa fatica aggiungere una parolina, mettere "struct" davanti, come è obbligatorio per il 'C', evita questi problemi
gpb01:
... continuno a dire che, dato che non fa fatica aggiungere una parolina, mettere "struct" davanti, come è obbligatorio per il 'C', evita questi problemi
Guglielmo
Ma non è questione di fatica è più per capirci qualcosa. tra l'altro se hai letto, funziona mettendolo anche SOLO sulla riga 640 e non sulle righe di definizione del tipo e della variabile, quindi puoi immaginare uno come me che non è molto esperto di codice si trova spiazzato nel leggere suggerimenti che coincidono in parte con il comportamento del compilatore. Stavo andando fuori di testa.
SukkoPera:
In ogni caso vuol dire che il linguaggio non è correttamente supportato. Se l'OP è d'accordo, aprirei un bug ad Arduino allegando lo sketch.
Si si se riesci a farlo tu te ne sarei grato. Anche perchè se c'è da argomentare sarei un po' in imbarazzo
gianlucaf:
Ma non è questione di fatica è più per capirci qualcosa. tra l'altro se hai letto, funziona mettendolo anche SOLO sulla riga 640 e non sulle righe di definizione del tipo e della variabile
Ecco, se invece IMPARI a metterlo SEMPRE (come il C ti obbliga a fare), ti eviti i problemi !
scusa se insisto ma inizialmente thread del 18 Agosto avevo provato anche con il typedef che teoricamente dovrebbe eliminare la necessità di inserire struct ad ogni dichiarazione sostituendo interamente il nome del tipo.
Tuttavia mi restituiva e restituisce anche oggi l'errore famoso. L'unica soluzione è quella di mettere lo struct nella dichiarazione della funzione e questo va contro anche la bibbia del C.
SukkoPera:
In verità non è detto, non mi è ben chiaro perché in questo caso metterlo risolva il problema, la struct rimane comunque definita dopo.
... l'iIDE, con questa storia di voler creare lui i "prototipi" ha sempre fatto casino !!!
Molto meglio se insegnavano alla gente o a mettere i "prototipi" a mano od ad obbligarla a mettere le funzioni prima di dove vengono richiamate. Con il fatto che invece fanno tutto loro in automatico ... :