[RISOLTO] Valorizzare una variabile ottenendo il nome da un'altra variabile

Ciao,
mi stavo chiedendo se è possibile ottenere un valore di una variabile utilizzando un'altra variabile per definire il nome della variabile da utilizzare.
Nell'esempio sotto variabile_voluta contiene il nome della variabile che contiene il valore (qui è generato a caso, nel versione reale è impostato da un'altra funzione).
La funzione VALUTA_VARIABILE alimentata con variabile_voluta (che vale ad esempio valore_variabile_b) dovrebbe capire qual'è la variabile da utilizzare (nell'esemio valore_variabile_b) e restituirne il valore.
Nell'esempio ho messo anche un #define ma sono quasi certo che questo non sia possibile perché i #define vengono sostituiti con i relativi valori in compilazione, come mi confermerete.

# define valore_statico 42
Int valore_variabile_a = 1248;
Int valore_variabile_b = 8421;

String variabile_voluta;

void setup(){
  Serial.begin();
}

void loop(){
  switch(random(2){
    case 0:
      variabile_voluta = "valore_statico";
      break;
    case 1:
      variabile_voluta = "valore_variabile_a";
      break;
    case 2:
      variabile_voluta = "valore_variabile_b";
      break;
    };
  Serial.println(VALUTA_VARIABILE(variabile_voluta));
}

Non puoi farlo con le stringhe.
Puoi usare i puntatori.

int PrimaVariabile = 1;
int SecondaVariabile = 2;

int* VariabileVoluta;

void setup() {
  Serial.begin(9600);

  *VariabileVoluta = PrimaVariabile;

  Serial.println(*VariabileVoluta);
}

Ma in realtà nella tua riga

 *VariabileVoluta = PrimaVariabile;

PrimaVariabile vorrei che fosse il valore di una variabile stringa, ovvero io dovrei passare "PrimaVariabile" o "SecondaVariabile".

Non puoi farlo
Ne con le stringhe che poi tu intendi oggetti String, pessima cosa
Ne coi puntatori

Non siamo in un ambiente con un linguaggio interpretato il nome della variabile non esiste all'interno del programma, quello che chiedi è impossibile

Spiega la necessità, che forse non ne hai realmente bisogno

Temo che siamo di fronte al solito problema XY

non sono sicuro di aver compreso bene cosa ti serve...ma per quel che ho capito potresti usare le stringhe JSON che ti danno coppia di "chiave : valore"...e la chiave la gestisci appunto come stringa o Stringa.

Fare esattamente come vorresti non è possibile in C e neanche nei linguaggi che conosco.
Ma dovresti riflettere perché i linguaggi non danno questa possibilità, semplicemente perché non serve a risolvere nessun problema, se qualcosa è utile o indispensabile a risolvere problemi esiste, se non esiste non serve.
In C ci sono i puntatori, si possono usare array paralleli o altro che non mi viene in mente, e sicuramente sono più adatti di quello che ti è venuto in mente.

torn24:
Fare esattamente come vorresti non è possibile in C e neanche nei linguaggi che conosco

In Python, che permette l'introspezione, è una cosa tecnicamente possibile:

>>> pippo = 96
>>> pluto = 120
>>> print(locals()["pippo"])
96
>>> nome = "pluto"
>>> print(locals()[nome])
120

Ma anche in Python se ci si trova a dover ricorrere a questo significa aver profondamente sbagliato qualcosa nel modo in cui risolvere un problema :wink:

Oppure OP vuole realizzare un tipo di elaborazione che richiede un livello di astrazione maggiore di quello permesso dalla semantica stretta del C, e allora il suggerimento di orso è molto sensato, tra l'altro il risultato ritornato dalla funzione locals di Python (un dizionario) corrisponde proprio ad una struttura Json chiave→valore.

Sicuramente avrò preso la strada sbagliata per fare quello che mi serve e come suggerite devo ripensarla.
Diciamo che voglio associare un nome ai vari pin: es. PI_1=2, PI_2=8, ...
Con una chiamata http voglio restituire il valore di un pin passato nell'uri, es. ?pin=PI_1.
Ho provato con gli array bidimensionali nome-valore, ma devo fare la scansione fino a quando non trovo il nome cercato.
Mi sembra che json si la strada corretta.

mymage:
Ho provato con gli array bidimensionali nome-valore, ma devo fare la scansione fino a quando non trovo il nome cercato.

Per forza di cose, ma dov'è il problema nel fare la scansione?
Io farei cosi: definisci una struct dove memorizzare tutte le caratteristiche necessarie da associare a ciascun pin (numero, nome, tipo, stato etc ect ) e poi un array di questa struct appena definito.
A questo punto crei una funzione "getter" che passato il nome o quel che preferisci in ingresso, ti restituisce un bel json completo di tutte le caratteristiche e quello lo passi alla tua webpage dove qualche riga di javascript farà il resto.
Ovviamente è solo un modo tra i tanti... giusto per offrirti qualche spunto di riflessione.

cotestatnt:
Per forza di cose, ma dov'è il problema nel fare la scansione?

Mah forse solo l'idea di fare qualcosa di non efficiente, comunque tra array e json ne vengo fuori.

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