- Programmazione » Programmazione » Guida C - Manuale programmazione con articoli e risorse interessanti
Gli enumeratori
ENTITA' COMPLESSE
Gli enumeratori sono un ulteriore strumento che il C rende
disponibile per rappresentare più agevolmente i dati
gestiti dai programmi. In particolare essi consentono di
descrivere con nomi simbolici gruppi di oggetti ai quali
è possibile associare valori numerici
interi.
Come noto, le variabili di un programma possono
rappresentare non solo oggetti quantificabili, come un
importo valutario, ma anche qualità non numerabili
(come un colore o il sesso di un individuo) la cui
caratteristica principale è il fatto di essere
mutuamente esclusive. Normalmente si tende a gestire tali
qualità "inventando" una codifica che
permette di assegnare valori di tipo integral ai loro
differenti modi di manifestarsi (ad esempio: al colore nero
può essere associato il valore zero, al rosso il
valore 1, e così via; si può
utilizzare il carattere 'M' per
"maschile" e 'F' per
"femminile, etc.). Spesso si ricorre alle direttive
#define, che consentono di associare, mediante la
sostituzione di stringhe a livello di preprocessore, un
valore numerico ad un nome descrittivo.
L'uso degli enumeratori può facilitare la stesura
dei programmi, lasciando al compilatore il compito di
effettuare la codifica dei diversi valori assumibili dalle
variabili che gestiscono modalità qualitative, e
consentendo al programmatore di definire ed utilizzare nomi
simbolici per riferirsi a tali valori. Vediamo un
esempio:
enum SEX {
ignoto, // beh, non si sa mai...
maschile,
femminile
};
La dichiarazione di un enumeratore ricorda da vicino quella
di una struttura: anche in questo caso viene definito un
template; la parola chiave enum è seguita dal
tag, cioè dal nome che si intende dare al modello di
enumeratore; vi sono le parentesi graffe aperta e chiusa,
quest'ultima seguita dal punto e virgola. La differenza
più evidente rispetto alla dichiarazione di un
template di struttura consiste nel fatto che laddove in
questo compaiono le dichiarazioni dei campi (vere e proprie
definizioni di variabili con tanto di indicatore di tipo e
punto e virgola), nel template di enum vi è
l'elenco dei nomi simbolici corrispondenti alle possibili
manifestazioni della qualità che l'enumeratore
stesso rappresenta. Detti nomi simbolici sono separati da
virgole; la virgola non compare dopo l'ultimo nome
elencato.
Anche la dichiarazione di una variabile di tipo
enum ricorda da vicino quella di una variabile
struttura:
enum SEX sesso;
....
sesso = maschile;
....
if(sesso == maschile)
printf("MASCHIO");
else
if(sesso == femminile)
printf("FEMMINA");
else
printf("BOH?");
Il codice riportato chiarisce le modalità di
dichiarazione, inizializzazione e, in generale, di utilizzo
di una variabile di tipo enum.
E' inoltre possibile notare come in C, a differenza di
quanto avviene in molti altri linguaggi, l'operatore di
assegnamento e quello di confronto per uguaglianza hanno
grafia differente, dal momento che quest'ultimo si
esprime con il doppio segno di uguale.
Ovviamente il compilatore, di soppiatto, assegna dei valori
ai nomi simbolici elencati nel template
dell'enum: per default al primo nome è
associato il valore 0, al secondo 1, e
così via. E' comunque possibile assegnare valori a
piacere, purché integral, ad uno o più nomi
simbolici; ai restanti il valore viene assegnato
automaticamente dal compilatore, incrementando di uno il
valore associato al nome precedente.
enum SEX {
ignoto = -1,
maschile,
femminile
};
Nell'esempio, al nome ignoto è assegnato
esplicitamente valore 1: il compilatore assegna
valore 0 al nome maschile e 1 a
femminile. I valori esplicitamente assegnati dal
programmatore non devono necessariamente essere consecutivi;
la sola condizione da rispettare è che si tratti di
valori interi.
Il vantaggio dell'uso degli enumeratori consiste nella
semplicità di stesura e nella migliore
leggibilità del programma, che non deve più
contenere dichiarazioni di costanti manifeste né
utilizzare variabili intere per esprimere modalità
qualitative. Inoltre, la limitazione del fabbisogno di
costanti manifeste rappresenta di per sé un vantaggio
di carattere tecnico, in quanto consente di limitare i rischi
connessi al loro utilizzo, in particolare i cosiddetti
side effect o effetti collaterali.