Usare il #define con gli array

Esatto, quello era chiaro, ma quindi con le variabili di tipo array come devo dichiararle in un define?
Riprendendo il tuo esempio, sarebbe tipo:

#define const char* const chords[][5]  {
    {"G4","B4","D5"},
    {"GS4","C5","DS5"},
    {"A4","CS5","E5"}
}

Oppure dici di dichiararle senza usare il define?

NON puoi dichiarare una variabile con un #define, al massimo la inizializzi ad un valore "definito".

#define token-string identificatore

#define SOSTITUISCE (senza farsi alcuna domanda di compatibilità o correttezza del tipo di dati) il testo token-string ovunque si trovi nel sorgente, con il testo identificatore PRIMA della compilazione quindi di quali variabili tu vuoi usare, il compilatore non ne ha ancora la più pallida idea....

Tra l'altro l'utilizzo eccessivo del #define per i valori costanti è una prassi sconsigliata nel C++.
Quindi se hai bisogno di variabili costanti, usa variabili costanti.

const byte var1 = 16;
const int var2 = 50;
const char* var3 = "Ciao mondo";
const int mioArray[] = {1, 2, 3, 4 };

@gepponline : credo NON ti sia chiaro cosa succede con le #define ...
... quando compili un programma, PRIMA di compilarlo, il pre-processore va a guardare le #define, prende le definizioni e, come fosse un editor, va a SOSTITUIRE nel codice quello che hai definito.

Se tu scrivi:

#define pippo 123456

... il pre-processore, prima di passare il programma al compilatore, fa l'equivalente del cerca/sostituisci dell'editor. Va nel sorgente, cerca ovune la parola "pippo" ed al suo posto ci mette quello che hai definito, ovvero, "123456", dopo di che prende il sorgente così modificato e lo passa al compilatore.

Esempio, se ne codice tu hai una riga in cui hai scritto:

a = pippo;

... il pre-processore, prima di mandarla in compilazione la modifica come:

a = 123456;

... e poi passa il tuo testo al compilatore.

Capisci quindi che nella #define devi mettere cose che poi, quando sostituite nel sorgente, creino delle righe compilabili e non delle cose che danno errore di sintassi. :wink:

Guglielmo

1 Like

Perfetto, ora è più chiaro.
Scusate ma sono un programmatore LabVIEW e di PLC e non ho mai digerito il codice scritto perché mi son sempre perso nelle sintassi, quindi mi mancano alcune nozioni.
Vedo come ne esco :grin:

Aggiungo, poi forse ho finito, se nel file h metto invece delle dichiarazioni di variabili normali, queste saranno considerate globali?

@gepponline
mi pare che quelle che tu usi sono delle "costanti" create come define/parola

Cioè se hai nel programma principale delle dichiarazioni:
#define K_PINLED 13
byte mioPin = K_PINLED;

e vuoi levarti dalle scatole la sfilza di define e le metti in un .h okay.
ma anche la dichiarazione puoi metterla in un .h e poi includerlo. Però nel programma principale poi non vedi più tu ad occhio le dichiarazioni, scomodo.

Ultima tua domanda, si, vedi risposta di @cotestatnt a post n.18
" Quando metti un #include "nomeFile.h" è più o meno come se dici al compilatore "prendi il testo contenuto nel file nomeFile.h e mettilo qui" quindi la sintassi deve essere esattamente la stessa."

[OFF-TOPIC]

... sono stato Alliance Member di National Instruments per moltissimi anni (parliamo degli anno '90 a seguire) ... il mio primo corso di LabVIEW™ eè stato relativo alla versione 3.0 nel Marzo 1994 :grin:

NON è un linguaggio che mi piace e capisco perfettamente le tue difficoltà ... le stesse che ha chi è abituato alla programmazione classica e si trova davanti a LabVIEW™ :crazy_face: :crazy_face: :crazy_face:.

[/OFF-TOPIC]

Guglielmo

[OFF-TOPIC]
io ormai programmo con labview da 25 anni e senza sarei perduto lo adoro tanto e altrettanto odio le politiche aziendali di NI :slight_smile:
Adesso poi hanno fatto la versione community gratuita quindi mi da anche qualche chance di usarla per progettini privati anche ocn Arduino, ma voglio prima realizzarli come si deve col suo IDE

Scusa, Guglielmo: mi sembra, però, che il compilatore effettui la sostituzione solo quando trova la parola staccata da altre, vero? Cioè se trova pippo ci mette 123456, ma se trova pippoABC non diventa 123456ABC, o no?...

Si, è un find/replace della parola da sola, non in mezzo ad un altra :wink:

Guglielmo

Vi allego il manuale del pre-processore The C Preprocessor.pdf (470.2 KB) ...
... ci sono dentro tante belle cosette :wink:

Guglielmo

1 Like

Grazie! :slight_smile:

Tornando a noi, Una di queste due assegnazioni sarebbe corretta considerando che poi io richiamerei i valori di questo array con, per esempio, dei CH_G4[1]?
Serve anche inserire la dimensione dell'array o essendo dichiarato si conta da solo la dimensione?

const char* CH_G4[]={"G4","B4","D5"};

oppure

String CH_G4[]={"G4","B4","D5"};

oppure ancora

const  CH_G4[]={"G4","B4","D5"};

Li conta da solo.
L'ultima non è compilabile, non dici il tipo di dato
String evitalo

Perfetto, quindi, restando solo la prima, l'asterisco serve quindi lo gestisco come un puntatore o no?

@gepponline : ... posso consigliarti di comprare e studiare QUESTO?

E' il ... testo sacro del 'C' :grin:

Guglielmo

Certo che puoi :grin:
Vero anche che me lo eviterei volentieri per quanto possibile.
il C prevede trooooppe regole di sintassi che con i linguaggi grafico non ho e che dovrei re-imparare per fare un programmino stupido ogni morte di papa.
In teoria l'ho studiato (ma mai imparato)alle superiori, ma non avendolo mai messo in pratica, dopo 25 anni la vedo dura.
Prometto che ci guardo, ma per sto giro, speravo di uscirne con solo le dritte puntuali per sfangarla :sweat_smile:

... in realtà le hai anche li, sotto altra forma, ma le hai e se non le rispetti ... ti capita quello che è capiato con il vettore Arianne 5 :boom: :boom: :boom:

Guglielmo

1 Like

Certo, diciamo che la sintassi "cosmetica" è implicita e il debug ce l'ho RealTime e questo mi aiuta parecchio. :grin:

Da questo punto di vista, prendi una scheda di sviluppo con un micro che consente il debug hardware come ad esempio una Nucleo con STM32.
La programmi sempre con framework C++ "Arduino like", ma hai il programmatore/debugger hardware incluso con cui puoi fare debug in real time (anche se NON con l'IDE Arduino).

La possibilità di avere esecuzione passo-passo, breakpoint, watch list etc etc dal punto di vista "educativo", oltre che per il debug vero e proprio, è enormemente più efficace del piazzare dei Serial.println() qua e la per vedere cosa succede durante l'esecuzione.