Define e pragma message

Buongiorno.
Due domande.

#define Less 1
#define Sens 2.4
#define soglia0   75 / Less / Sens

Mi sembra che soglia0 non venga ridotta di 2.4 volte.
Dovrebbe dare 31

Sto cercando di visualizzare il risultato, durante la compilazione.
Però se scrivo.
#pragma message "soglia0" soglia0
mi risponde:

D:\Documenti\Project\FipPorte\Keyb3-Sw\Keyb3-Sw.ino:86:19: note: #pragma message: soglia0
 #define soglia0   75 / Less / Sens
                   ^
D:\Documenti\Project\FipPorte\Keyb3-Sw\Keyb3-Sw.ino:98:27: note: in expansion of macro 'soglia0'
 #pragma message "soglia0" soglia0
                           ^~~~~~~

Se invece scrivo
#pragma message soglia0
Non c'è traccia nel log, nemmeno nel log verbose.

Per il define prova a mettere delle parentesi
#define soglia0 (75 / Less / Sens)

... cosa NON possibile in questo modo (semplicemente con solo il #pragma message). Senza impazzire con soluzioni più complesse da implementrare, se vuoi vedere il valore, fallo stampare a run-time con una Serial.print().

Guglielmo

... se invece ti vuoi complicare un po' la vita, allora ... devi studiarti quella che in GCC è definita come "Stringification" e devi conoscere l'operatore stringify "#".

In pratica devi prima definire un paio di cose ...

#define STR(x) #x
#define XSTR(x) STR(x)

dopo di che potrai usare il #pragma message per stampare un valore che è definito con un #define, ad esempio:

#define VALORE 1234
#pragma message "il contenuto di VALORE è: " XSTR(VALORE)

... e, tra svariate righe che l'IDE ti marcherà in rosso troverai:

note: #pragma message: il contenuto di VALORE è: 1234

Buon divertimento :slight_smile:

Guglielmo

P.S.: ... quando posso, preferisco usare la molto più semplice via del Serial.print() :grin:

... che è la cosa più corretta da fare considerando che comunque NON viene calcolato il risultato nel #define.

#define, che è un cosa che riguarda il pre-processore, definisce un qualche cosa, che verrà sostituito da un altro qualche altra cosa, nel sorgente e poi compilato quindi 'soglia0' NON varrà 31.2 (ovvero il risultato di 75 / 1 / 2.4) ma verrà sostituto nel sorgente con l'espressione "(75 / 1 / 2.4)" e, al limite, calcolato in fase di compilzione dal compilatore.

Guglielmo

La seriale è attaccata a un hardware, non posso usarla.
Non mi va:

#define Less 1
#define Sens 2.4
#define soglia0   ( 75 / Less / Sens )
#define STR(x) #x
#define XSTR(x) STR(x)
#pragma message "soglia0: " XSTR(soglia0)

Messaggio:

D:\Documenti\Project\FipPorte\Keyb3-Sw\Keyb3-Sw.ino:101:41: note: #pragma message: soglia0: ( 75 / 1 / 2.4 )
 #pragma message "soglia0: " XSTR(soglia0)
                                         ^
D:\Documenti\Project\FipPorte\Keyb3-Sw\Keyb3-Sw.ino:99:17: note: in definition of macro 'STR'
 #define STR(x) #x
                 ^
D:\Documenti\Project\FipPorte\Keyb3-Sw\Keyb3-Sw.ino:101:29: note: in expansion of macro 'XSTR'
 #pragma message "soglia0: " XSTR(soglia0)
                             ^~~~

Certo che ti va !!! ... t'ho detto che il messaggio è nascosto tra altri mille che non ti servono ...

note: #pragma message: soglia0: ( 75 / 1 / 2.4 )

che ti aspettavi ? ? ? Quello vale il tua 'soglia0' ovvero quello che è messo nella #define, come ho spiegato nel post #5.

Guglielmo

In tal caso, se devi fare debug ... ti crei una seriale virtuale con la SoftwareSerial e stampi su quella (...collegandola alla USB del PC con un adattatore USB <--> seriale).

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.