modificare in modo dinamico il nome di una variabile

Sono nuovo alla programmazione in “C” e chiaramente, non ho una adeguata esperienza per fare ricerche mirate utilizzando gli appropriati termini in uso tra sviluppatori. In sintesi, non so fare la giusta domanda chiedo scusa in anticipo se ci saranno difficoltà nel capirsi.
La mia domanda è: è possibile accodare al nome di una variabile il contenuto di un’altra variabile?
Nell’allegato ho un piccola parte di codice (rubato) in cui vorrei modificare in automatico il nome della variabile “Help_1” operando un’operazione del tipo: Help_(Menu). Non voglio un array multidimensionale e neppure qualcosa che cambi il compilato ma semplicemente che agisca sull’interpretazione del compilatore.
Grazie per le risposte.

sketch_may18a.ino (1.51 KB)

A parte che, prima che lo dica Guglielmo p, è meglio se ti presenti nel thread apposito (primo del forum generale)
Non è possibile cambiare il o me alle variabili, in quanto in C il nome delle variabili NON è quello che gli diamo, bensì l'indirizzo di memoria ove si trovammo.
Di conseguenza devi trovare un altro metodo per ottenere il risultato desiderato (che non ho capito)

Come suggerito, presentati sul forum dicendo quali conoscenze hai di elettronica e programmazione. :slight_smile:

Poi quello che vorresti fare non è possibile non solo in C ma in nessun linguaggio di programmazione "almeno cosi mi risulta".

Ti CONSIGLIO di non descrivere, non chiedere come si fa quello che vorresti fare, secondo me è meglio che descrivi il problema che vuoi risolvere, perché sicuramente c'è una soluzione diversa da quello che vorresti fare.

Eccomi ...

**>tek-0: ** essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

Non ho mica capito cosa vuoi fare.

Un array é l' unico modo di accedere a delle variabili diverse usando una variabile (indice) per selezionare quale elemento accedere.

Se hai una Help1 e und HELP2 via Sketch non puoi scegliere in modo semplice se usare una o l' altra variabile.
Puoi fare con un if
a va da 0 a 1.
if (a == 0) usa Help1 else usa Help2
son un array scrivi:
usa Help[a]

Ciao Uwe

Ok! Grazie a tutti per la/le risposte, so che soluzioni possibili sono molteplici ma, l'algoritmo che ho utilizzato soddisfa pienamente le aspettative che mi ero preposto ed è stato selezionato tra due esempi pubblicati nella libreria "pgmspace.h". La mia scelta rispetto alla versione per stringhe è stata dettata dal fatto che con il comando "strlen_P" mi svincolava dal contare il numero di caratteri della stringa più lunga e, dal fatto che per pochi bytes è più parsimoniosa anche se a costo di qualche ciclo macchina in più. Il quesito sollevato riguardava più che altro l'editing ovvero, la possibilità in generale di gestire i nomi delle variabili in modo interlacciato. Sto cercando un mio modo di organizzare e scrivere il codice ed avendo avuto problemi nell'organizzare e ripulire da variabili orfane o variabili ridondanti cerco un modo per poter avere un maggior controllo e immediata visione del loro utilizzo senza dover scrivere variabili poema. Devo ancora farmi le ossa su tale linguaggio.
Ora vado oltre...
:slight_smile:
Per quanto concerne la possibilita di un array bidimensionale be! ciò provato ed ho fallito ma, prima di richiedere nuovamente la Vs. collaborazione/aiuto, volevo riprovarci con le mie forze e poi, eventualmente...
Il suggerimento di uwefed, l'ho già provato ma, il compilatore mi ha insultato, mi prendo un'attimo di pausa e riproverò d'altro canto sembra la via più semplice ed efficace.

Un array bidimensionale é un array normale dove kgni punto ha due indici.
Se in un array normale lo fai così:

byte monodim [5]={1,2,3,4,5};

E per identificare gli elementi in ordine gli chiami così

monodim [0]
monodim [1]
monodim [2]
monodim[3]
monodim [4]

Un array bidimensionale lo farai così

byte bidim [2][2]={1,2,3,4};

I singoli elementi gli chiami

bidim [0][0]
bidim[0][1]
bidim[1][0]
bidim[1][1]

Chiaro?

Silente:
Un array bidimensionale lo farai così

byte bidim [2][2]={1,2,3,4};

Da notare che è possibile assegnare i valori anche in un modo ... più "leggibile", separandoli per gruppi per singola "dimensione", ovvero ...

byte bidim[2][2] = {{1,2} , {3,4}};

dove la prima coppia indica i valori degli indici 0,0 e 0,1 e la seconda coppia indica i valori degli indici 1,0 e 1,1 e così via.

Personalmente la preferisco perché ... mi migliora la leggibilità e la verifica delle corrette assegnazioni.

Prendiamo difatti un array un po' più grosso, ad esempio un 3x4 ... si potrebbe scrivere:

byte mioArray[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

oppure si può scrivere:

byte mioArray[3][4] = {
   {0,1,2,3},
   {4,5,6,7},
   {8,9,10,11},
}

che, secondo me, è decisamente più "leggibile" e verificabile :smiley:

Guglielmo

tek-0:
riguardava più che altro l'editing ovvero, la possibilità in generale di gestire i nomi delle variabili in modo interlacciato. Sto cercando un mio modo di organizzare e scrivere il codice ed avendo avuto problemi nell'organizzare e ripulire da variabili orfane o variabili ridondanti cerco un modo per poter avere un maggior controllo e immediata visione

Già tenere dentro le funzioni tutte le variabili locali, lasciando globali solo quelle strettamente necessarie a contenere lo stato condiviso secondo me aiuta a mantenere l'ordine.

E le locali che devono mantenere i valori tra una chiamata e l'altra delle funzioni basta dichiararle static (così ogni funzione può avere una variabile interna 's' per lo stato, 't' per il tempo, 'cnt' per i conteggi ecc. che mantengono i valori come se fossero globali).

Un'altra possibilità sono le struct, che permettono (in quest'ottica) di racchiudere gruppi di variabili dentro una "valigetta" più comoda da "portare in giro", che unisce in un unico contenitore logico variabili legate in qualche modo tra loro:

struct {
    byte hour = 0;
    byte minute = 0;
    boolean enabled = false;
} alarm;
if(alarm.enabled  &&  alarm.minute == now.minute  &&  alarm.hour == now.hour) ...

NOTA: fare attenzione nel passaggio di struct a funzioni di passarle per riferimento (come gli array) e non per valore (perché ne verrebbe creata una copia locale sullo stack).

Claudio_FF:
Già tenere dentro le funzioni tutte le variabili locali, lasciando globali solo quelle strettamente necessarie a contenere lo stato condiviso secondo me aiuta a mantenere l'ordine.

E le locali che devono mantenere i valori tra una chiamata e l'altra delle funzioni basta dichiararle static (così ogni funzione può avere una variabile interna 's' per lo stato, 't' per il tempo, 'cnt' per i conteggi ecc. che mantengono i valori come se fossero globali).

Un'altra possibilità sono le struct, che permettono (in quest'ottica) di racchiudere gruppi di variabili dentro una "valigetta" più comoda da "portare in giro", che unisce in un unico contenitore logico variabili legate in qualche modo tra loro:

struct {

byte hour = 0;
   byte minute = 0;
   boolean enabled = false;
} alarm;





if(alarm.enabled  &&  alarm.minute == now.minute  &&  alarm.hour == now.hour) ...



NOTA: fare attenzione nel passaggio di struct a funzioni di passarle per riferimento (come gli array) e non per valore (perché ne verrebbe creata una copia locale sullo stack).

Grazie per i suggerimenti, li farò miei.