problema compilazione con v1.8.7

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"

TAFFY_V1.3.ino (32.7 KB)

Eppure ti avevo spiegato che per come hai scritto tu, il tipo si chiama "struct ricetta". Devi aggiungere un typedef...

quindi non ho capito una mazza dell'esempio che mi ha fatto tu qui.

Ottimo.

Mi chiedo perchè da una versione all'altra la compilazione sia così diversa.

Forse ho detto una vakkata, rivedo dopo.

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.

grazie del tempo che mi dedicate.

Come mai la 1.8.5 lo compili è da capire, comunque la sintassi, in 'C', non è corretta ...

  1. dichiari una struct di nome "ricetta"

  2. se vuoi dichiare delle variabili che hanno quella struttura, la sintassi corretta è:
    "struct nome_struttura nome_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).

Guglielmo

... 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" :smiley: e per le spiegazioni sul C++ lascio la parola a SukkoPera. :wink:

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 ... ::slight_smile:

Guglielmo

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.

Non vedo motivi per cui non debba compilare, ora indago meglio.

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

Guglielmo

ok, funziona perfettamente anche SOLO aggiungendo struct davanti alla definizione

int selectricetta(struct ricetta ric[]) {

riga 640

e ora compila anche Sublime Text con Stino. Mistero risolto in parte.
Più me lo spiegate e più non capisco niente di come funziona la struct :smiley:

In tutta onestà, io non ho mai visto scritto struct in C++ fuori dalla dichiarazione. Si evitano le ambiguità a priori e via :).

Tieni presente che struct è assolutamente equivalente a class in C++, cambia solo la visibilità di default dei membri.

@gianlucaf: Sì, ma DEVE funzionare anche senza, vedo di capire perché.

Mi sa che sei incappato in un bug del builder di Arduino 1.8.7 :confused:. 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.

Vedere allegati.

ricette.ino-185.cpp (34.7 KB)

ricette.ino-187.cpp (33.9 KB)

SukkoPera:
Mi sa che sei incappato in un bug del builder di Arduino 1.8.7 :confused:. ...

... continuno a dire che, dato che non fa fatica aggiungere una parolina, mettere "struct" davanti, come è obbligatorio per il 'C', evita questi problemi :wink:

Guglielmo

In ogni caso vuol dire che il linguaggio non è correttamente supportato. Se l'OP è d'accordo, aprirei un bug ad Arduino allegando lo sketch.

gpb01:
... continuno a dire che, dato che non fa fatica aggiungere una parolina, mettere "struct" davanti, come è obbligatorio per il 'C', evita questi problemi :wink:

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

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 !

Guglielmo

P.S.: L'ho sempre detto che il C++ è la peste ... :smiling_imp: :smiling_imp: :smiling_imp:

In verità non è detto, non mi è ben chiaro perché in questo caso metterlo risolva il problema, la struct rimane comunque definita dopo.

Ora apro l'issue.

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 ... ::slight_smile:

Guglielmo

gianlucaf:
L'unica soluzione è quella di mettere lo struct nella dichiarazione della funzione e questo va contro anche la bibbia del C.

NO, perché ? tu dichiari che il tuo parametro "ric" è di tipo "struct ricetta" ... che è corretto fare !

Guglielmo