Newsgroup: it.comp.lang.c++
Titolo: Posso usare una variabile così?

Salve a tutti.
Volevo sapere se è possibile utilizzare una variabile in modo che il 
programma la sostituisca all'interno di una parola che indichi 
qualcos'altro.
Per esempio, per restare nei miei soliti problemi con i random:
int num0 = 1;
int num1 = 2;
int num2 = 3;
k = rand()%3;
cout << num*k*;
fare cioè in modo che il compilatore capisca che in quella situazione 
deve sostituire *k* con l'attuale valore di k.
si può fare?
grazie
Leo
PS: il punto non è come risolvere questo specifico problema, un 
work-around si trova sempre, volevo solo sapere se è possibile fare una 
cosa del genere

scusami se questa soluzione la considererai un work-around, ma gli array
(in questo caso di interi) sono stati inventati apposta!

 si puň fare?
Si, con una soluzione chiamata array. La tua idea č azzeccata, solo che 
la sintassi č un po'differente da quella che hai scritto. Se scrivi il 
numero alla fine della variabile, il compilatore pensa che faccia parte 
del nome stesso, quindi non lo tratta come un numero. La sintassi da 
usare č questa (ti scrivo quella che piů somiglia al tuo codice):
/* Qui stai dichiarando un array che contiene 3 elementi di tipo int. */
int num[3];
/* adesso la sintassi per gli assegnamenti */
num[0]=1;
num[1]=2;
num[2]=3;
/* ...e, mutatis mutandis, tutto il resto de tuo programma */
k=rand()%3;
cout << num[k];
per ulteriori info fai una ricerca con google, sugli array trovi di 
tutto e di piů, ciao!


Il cross-post (X-post) e' malvisto dagli utenti di usenet, ti consiglio di 
cercare e leggerti la netiquette, prima che qualcuno ti risponda in malo modo!
happy hacking!
-- 
Paolo

 qualcos'altro.
Dal linguaggio no, ma puoi farlo usando le librerie per gli shared
object (*.dll in windows, *.so in unix). Questo perche` queste funzioni
accettano una stringa qualsiasi e ti ritornano l'indirizzo di memoria
del simbolo che gli hai passato come stringa. In C e` abbastanza facile,
in C++ c'e` di mezzo il mangling, cioe` il simbolo invece di essere la
stringa "num0" e` qualcosa tipo "_EvInum0X7ajIjJF" (inventato) e per
evitare il mangling si usa extern "C".
Conosco solo quello sotto linux, dlopen e famiglia. dlopen apre un file
shard object dandogli il nome, ma se gli passi NULL usa l'immagine del
processo stesso, quindi puoi farti dare l'indirizzo di memoria di un
simbolo (una variabile globale, una funzione) del tuo programma.
In windows si chiama LoadLibrary.
extern "C" int num0 = 1;
extern "C" int num1 = 2;
extern "C" int num2 = 3;
void f() {
	void* h = dlopen(NULL, flags);
	ostrstream s;
	s << "num" << (rand()%3) ;
	void* sym = dlsym(h, s.str());
	cout << (int)(*sym);
}
ATTENZIONE: codice scritto al volo con tantissimi errori! Correggere
bene prima dell'uso, da compilare dopo i pasti :-)
Ciao
--
int

 si può fare?
Risposta semplice: NO.
Risposta un po' meno semplice: non come vuoi tu. A parte l'ovvio 
workaround in questo caso dell'utilizzo degli array, gli array 
associativi possono esserti d'aiuto, e sono resi in c++ dalla classe 
standard 'map' (se usi il g++ con libstdc++, c'è anche hash_map).
Un array associativo è simile ad un array normale, ma gli indici possono 
essere di qualunque, tipo anche stringhe, come in:
map<string, int> aa; // array di int indicizzato da string
aa["pippo"] = 1;
Puoi pensare di stare accedendo alla variabile "pippo" (e quindi puoi 
comporne il nome concatenando stringhe).
Daniele