Usare il #define con gli array

...ma ciao!
è possibile utilizzare un file di libreria richiamato con l'include, che contenga al suo interno delle costanti di tipo array?
Una cosa cosi':

#define G4[]  {0,63}
#define GS4[] {64,127}
#define A4[]  {128,191}

oppure cosi':

#define CH_G4[] {"G4","B4","D5"}
#define CH_GS4[]  {"GS4","C5","DS5"}
#define CH_A4[] {"A4","CS5","E5"}

Mi sta dando errore di compilazione :
exit status 1
expected ';' before '}' token

E non capisco se è perhcè non è possibile o se serve una sintassi particolare.
Siccome gli elementi sono parecchi, preferirei, per pulizia, non dover dichiarare ogni singolo elemento nel programma principale.
grazie mille!
Geppo!

  1. se non scrivi ANCHE come usi quelle costanti, difficile aiutarti.

  2. una #define semplicemente il precompilatore rimpiazza la parola a desta con quello che sta a sinistra. se necessario un ; lo hai dimenticato

3., se vuoi semplificare il programma principale, metti quelle dichiarazioni di array in un altro file .h esempio pippo.h e poi fai #include "pippo.h" al posto delle dichiarazioni nel file principale

Se togli le parentesi quadre ed assegni il #define ad un array compili correttamente, ma non capisco qual'é il vantaggio ad usare il #define al posto dei valori costanti per inizializzare un array.

#define arr_val {1,2,3}
int my_arr[] = arr_val;

Si forse non sono stato chiaro quando ho detto che uso l'include.
Il mio dubbio non era sull'uso dell'include e il file separato, ma sulla sintassi per dichiarare gli array in quel file.
Uso il define perchè tutti quegli array ce li ho in due file .h separati dal programma principale.
Per questo non ci sono i punti e virgola.
Si tratta praticamente di accordi musicali che vado a richiamare a seconda del valore di un potenziometro
In un file .h ho il range di posizione che definisce l'accordo e in un altro ho le note che costituiscono l'accordo.
Quindi seguendo gli esempi che vi ho postato, se il potenziometro è in posizione 65.
Vorrei fare una cosa cosi0:

... 
else if  (posizione >= GS4[0] && posizione < GS4[1]){
      accordo = CH_GS4;

Po quella variabile accordo la paserei ad una funzione che si occuperebbe di prendere i singoli elementi e convertirli in frequenze.
Puo' funzionare? Confermate che basta togliere le parentesi quadre nel define?

Con solo pezzi non possiamo dirti nulla.
Cosa è accordo ? di che tipo è ?
la define di CH_GS4 non ha nessun senso.

Ti ripeto che la #define semplicemente sostituisce, come ti ha mostrato @cotestatnt
ma... SOLO nella dichiarazione della variabile puoi indicare gli elementi tra graffe.
Se ti aspetti che la riga:
accordo = CH_GS4;
al posto di CH_GS4 venga messo {1,2,3} ovvero un elenco di elementi, non è possibile.

accordo è una variabile di tipo Array e si, vorrei che a quel punto contenesse {"GS4","C5","DS5"}
Così come succede se anziché usare gli Array uso dei valori interi.
Cioè:
Se nel file.h ho:
#define CH_GS4 27
E nel programma principale accordo lo inizializzo come intero, a quel punto accordo=CH_GS4 fa sì che accordo valga 27.

Se invece nel file.h avessi:
#define CH_GS4 {"GS4","C5","DS5"}
Nel programma principale accordo lo inizializzerei come Array e vorrei che accordo=CH_GS4 facesse si che accordo valga {"GS4","C5","DS5"}

È plausibile o comunque fattibile una cosa del genere in qualche modo?

Ma non puoi semplicemente usare un array di char array?
(magari mettendolo in flash per risparmiare RAM, anche se si complica un po' recuperare le stringhe).

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

Esempio chords.ino

Chiaramente l'array lo puoi mettere in file .h qualsiasi ed includerlo dove ti serve.

Che stai pasticciando con gli accordi maggiori?... :smiley:

No perché se definisci un array, stai dichiarando un puntatore ad una zona di memoria di dimensioni pari a quella occupata dall'array stesso. Infatti devi o specificare la dimensione, oppure inizializzarlo con dei valori in sede di dichiarazione.

char accordo[] = {....};

se fai un qualcosa del genere
accordo = x;

stai assegnando la variabile x ad un puntatore a char ed il casino è assicurato.

Per fare ciò che dici tu devi scrivere
accordo[indice]=x;

Potrei eventualmente farlo ma In questo caso il mio problema sarebbe:

  1. la sintassi nel file.h quale sarebbe?
  2. mi perderei per strada il nome dell'accordo che mi torna utile.
  3. l'unica differenza nel mio software sarebbe che invece che scrivere
accordo = CH_GS4

Dovrei scrivere qualcosa tipo

accordo=chords[2]

Giusto?

So costruendo uno strumento musicale.
Una specie di otamatone ma politonale :grin:

No, per i motivi di cui sopra.

Per recuperare il nome dell'accordo puoi fare un secondo array "allineato" al primo, oppure definire una struttura che contiene tutte le informazioni associate all'accordo (nome, note, ottava etc etc) e fare un array di struct.

Per quanto la sintassi è esattamente come se scrivessi nel file .ino principale dive poi andrai a richiamare il file.h con un #include

Ma io so già quanto sarà grande l'array, quindi lo inizializzerei come

char accordo[3];

O qualcosa del genere con un asterisco prima perché io non devo contare i caratteri ma le stringhe...:sweat_smile:
Tipo:

char *accordo[3];
Per fare ciò che dici tu devi scrivere
accordo[indice]=x

Sarebbe più un:

accordo[indice]=x[indice1][indice2]

Un valore ad un valore senza avere passaggi tra array

Esatto.
Guarda l'esempio che ho linkato più su, ho modificato per includere da un file esterno ed ho aggiunto anche alcuni array in setup() per provare a farti capire perché non puoi usare la forma

accordo = quello_che_ti:pare

con gli array (ovvero senza parentesi quadre ).
Il casting ad (int) server per la Serial.println()

Questo è più o meno lo stesso esempio di prima, ma usando un array di struct

P.S.

Il file diagram.json ha a che fare con il simulatore, non con lo sketch

Perfetto, appena sarò da PC gli di un occhio bene.
Quindi mi sembra di capire che con gli Array ci vogliono mille precauzioni e poi mi servirebbero dei puntatori ecc..
Posso chiederti quale sarebbe la sintassi nel file .h?

Non riesco a capire cosa intendi con sintassi... Forse ti riferisci a come vengono scritte librerie e classi?

Si tratta di C++, proprio come per il file .ino

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.

No è che io l'unico file di supporto di tipo h che ho mai usato è un file in cui vengono definite una sfilza di variabili con la sintassi:

#define nome_variabile1 valore
#define nome_variabile2 valore
#define nome_variabile3 valore

Quindi ha una sintassi diversa dalla dichiarazione di variabili all'interno del file .ino
Non ha segni di uguaglianza ne punti e virgola.
Vorrei continuare ad usare questo tipo di file h per dichiarare le variabili in un file dedicato visto che sono "tante".

Si tratta sempre di C++

https://www.arduino.cc/reference/en/language/structure/further-syntax/define/

https://en.cppreference.com/w/cpp/preprocessor

Le parole che iniziano con l'hash # sono tipicamente delle direttive per il compilatore (anzi per l'esattezza al preprocessore).