[RISOLTO]stesse istruzioni ma in uno sketch da errore

PaoloP:
...
@Guglielmo.
Ne avevamo già parlato.

Paolo, avevo già provato ... da ugualmente errore, non c'entrano nulla i commenti ... ]:smiley:

Copia il codice e fai la prova (con l'IDE 1.0.5) ... l'unico modo per compilarlo è non usare le #define ... :astonished:

Guglielmo

hai fatto la define di due parametri della shiftOut() presente in Arduino.h, clockPin e dataPin
prova ad aggiungere al nome anche solo una x xclockPin e xdataPin

Arduino.h riga 111:
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);

Nel secondo sketch il file Arduino.h forse viene incluso dopo le tue #define.

Però nei file .h lasciare il nome dei parametri no ha senso, secondo me.
Al compilatore basta il tipo:
void shiftOut(uint8_t , uint8_t , uint8_t , uint8_t );

Ho scoperto l'inghippo!
Dovete dirlo, sono trooooppo forte :wink:

Il problema è qui:
#define latchPinOUT 11//Pin connected to ST_CP of 74HC595
#define clockPinOUT 12//Pin connected to SH_CP of 74HC595
#define dataPinOUT 10//Pin connected to SH_CP of 74HC595

OUT tutto maiucolo probabilmente è un'altra define messa chissà dove.
Se mettete minuscolo (sostituendo ovviamente nel codice):
#define latchPinOut 11//Pin connected to ST_CP of 74HC595
#define clockPinOut 12//Pin connected to SH_CP of 74HC595
#define dataPinOut 10//Pin connected to SH_CP of 74HC595

Compila senza errori.
Ecco un altro motivo per NON usare le define in questi casi perché non sai mai che catena di sostituzione ti attiva il compilatore.

fatto adesso funziona, devo imparare ancora molto

grazie

stefano

Scusa @leo , ma è quello senza OUT che da errore perchè latchPin e dataPin sono parametri della shiftOut

@leo, a me piace usare il #define, perché la vedo molto legata alla definizione di un pin

stefano

nid69, sei trooooppo forte :sweat_smile:
Ho mescolato gli sketch ed i problemi ah ah ah :stuck_out_tongue_closed_eyes:
Mi vergogno come un cane :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

stefa24:
@leo, a me piace usare il #define, perché la vedo molto legata alla definizione di un pin
stefano

Ne abbiamo discusso in altro thread.
Con la define il compilatore sostituisce brutalmente la parola con quello che definisci e puoi incorrere in molti problemi, ad esempio
quello che è capitato a te.
Poi un altro vantaggio della const byte pinXX=10; è che dichiari il tipo
Tieni conto che la const NON è interpretata dal compilatore come variabile ma fa praticamente come la define, sostituisce ma in maniera più controllata.
Anche a me piaceva più la define, da vecchio programmatore di C, ma ho imparato a usare la const, grazie al forum.

P.S. @leo e figurati, nella fretta, capita.
Però perchè nelle varie .h del core oltre ai tipi dei parametri han lasciato il nome del parametro? Al compilatore non serve. Serve all'IDE ?

Appunto, per questo è meglio const.

stefa24:
@leo, a me piace usare il #define, perché la vedo molto legata alla definizione di un pin

stefano

Un #define non è legato a nulla.
Dice solo al compilatore: prendi questo e sostituiscilo con quest'altro. Però poi genera errori come quello che hai trovato tu e non sai perché.
Meglio sempre usare un const, perché in questa maniera vedi subito l'errore.

scusate non sapevo di quella discussione, nonostante segua quotidianamente, se no non avrei iniziato questa, comunque adesso starò più attento alle discussioni

stefano

@stefa24, non mi sembra un problema il tuo thread. Anche fossi stato a conoscenza della discussione già fatta sulle define (e mica puoi seguirle tutte !!!), non potevi sapere che quello era il problema del tuo sketch. :slight_smile:

Ma non ti devi scusare :wink:

ciao
nessun problema non mi sono sentito rimproverato, ero dispiaciuto di essermi perso quella discussione

stefano

leo72:
Meglio sempre usare un const, perché in questa maniera vedi subito l'errore.

No, il vero problema è che l'IDE di Arduino non fa vedere le varie warning e tutti gli errori, se provate a compilare lo stesso programma con AvrStudio si vede subito che l'errore è dovuto alla ridefinizione di un parametro usato da una libreria/funzione.
La diatriba define vs const è solo un questione di stile di programmazione e non una vera questione di vantaggio/svantaggio nell'uso di una o l'altra.

Secondo me c'e' un piccolo vantaggio, ma non sempre utile. Con la const sei obbligato a dichiararne il tipo mentre per una define o forzi un cast oppure è poi il compilatore che farà dei cast ove necessario.

io utilizzo il #define solo per i comandi che scrivono o leggono lo stato di un pin, digitalWrite/Read, latchpin, clockpin...

stefano

Sono concorde con ni69, ed espressi questo punto di vista anche in quella famosa discussione.

nid69ita:
Con la const sei obbligato a dichiararne il tipo mentre per una define o forzi un cast oppure è poi il compilatore che farà dei cast ove necessario.

Se con la #define esegui una sostituzione tra un alias e un valore numerico quest'ultimo verrà considerato in base al suo uso, se viene assegnato ad una variabile è questa è stabilire il tipo dato, se viene usato come parametro di una funzione è il prototipo di questa, e/o la sua definizione, a stabilire il tipo dato, se viene usato per un calcolo è il valore stesso a stabilire il tipo dato.