Strutture
Gli array permettono di raccogliere sotto un unico nome piu` variabili omogenee
e sono solitamente utilizzati quando bisogna operare su piu` valori dello stesso
tipo contemporaneamente (ad esempio per eseguire una ricerca). Tuttavia in generale
per rappresentare entita` complesse e` necessario memorizzare informazioni di
diversa natura; ad esempio per rappresentare una persona puo` non bastare una
stringa per il nome ed il cognome, ma potrebbe essere necessario memorizzare
anche eta` e codice fiscale. Memorizzare tutte queste informazioni in un'unica
stringa non e` una buona idea poiche` le singole informazioni non sono immediatamente
disponibili, ma e` necessario prima estrarle, inoltre nella rappresentazione
verrebbero perse informazioni preziose quali il fatto che l'eta` e` sempre data
da un intero positivo. D'altra parte avere variabili distinte per le singole
informazioni non e` certamente una buona pratica, diventa difficile capire qual'e`
la relazione tra le varie componenti. La soluzione consiste nel raccogliere
le variabili che modellano i singoli aspetti in un'unica entita` che consenta
ancora di accedere ai singoli elementi:
struct Persona {
char Nome[20];
unsigned short Eta;
char CodiceFiscale[16];
};
La precedente dichiarazione introduce un tipo struttura di nome Persona
composto da tre campi: Nome (un array di 20 caratteri), Eta
(un intero positivo), CodiceFiscale (un array di 16 caratteri).
La sintassi per la dichiarazione di una struttura e`
struct < NomeTipo > {
< Tipo > < NomeCampo > ;
/* ... */
< Tipo > < NomeCampo > ;
};
Si osservi che la parentesi graffa finale deve essere seguita da un punto e
virgola, questo vale anche per le unioni, le enumerazioni e per le classi.
I singoli campi di una variabile di tipo struttura sono selezionabili tramite
l'operatore di selezione . (punto), come mostrato
nel seguente esempio:
struct Persona {
char Nome[20];
unsigned short Eta;
char CodiceFiscale[7];
};
Persona Pippo = { "Pippo", 40, "PPP718" };
Persona AmiciDiPippo[2] = { {"Pluto", 40, "PLT712"},
{"Minnie", 35, "MNN431"}
};
// esempi di uso di strutture:
Pippo.Eta = 41;
unsigned short Var = Pippo.Eta;
strcpy(AmiciDiPippo[0].Nome, "Topolino");
Innanzi tutto viene dichiarato il tipo Persona e quindi si dichiara
la variabile Pippo di tale tipo; in particolare viene mostrato
come inizializzare la variabile con una inizializzazione aggregata del tutto
simile a quanto si fa per gli array, eccetto che i valori forniti devono essere
compatibili con il tipo dei campi e dati nell'ordine definito nella dichiarazione.
Viene mostrata anche la dichiarazione di un array i cui elementi sono di tipo
struttura, e il modo in cui eseguire una inizializzazione fornendo i valori
necessari all'inizializzazione dei singoli campi di ciascun elemento dell'array.
Le righe successive mostrano come accedere ai campi di una variabile di tipo
struttura, in particolare l'ultima riga assegna un nuovo valore al campo Nome
del primo elemento dell'array tramite una funzione di libreria. Si noti che
prima viene selezionato l'elemento dell'array e poi il campo Nome
di tale elemento; analogamente se e` la struttura a contenere un campo di tipo
non primitivo, prima si seleziona il campo e poi si seleziona l'elemento del
campo che ci interessa:
struct Data {
unsigned short Giorno, Mese;
unsigned Anno;
};
struct Persona {
char Nome[20];
Data DataNascita;
};
Persona Pippo = { "pippo", {10, 9, 1950} };
Pippo.Nome[0] = 'P';
Pippo.DataNascita.Giorno = 15;
unsigned short UnGiorno = Pippo.DataNascita.Giorno;
Per le strutture, a differenza degli array, e` definito l'operatore di assegnamento:
struct Data {
unsigned short Giorno, Mese;
unsigned Anno;
};
Data Oggi = { 10, 11, 1996 };
Data UnaData = { 1, 1, 1995};
UnaData = Oggi;
Cio` e` possibile per le strutture solo perche`, come vedremo, il compilatore
le tratta come classi i cui membri sono tutti pubblici.
L'assegnamento e` ovviamente possibile solo tra variabili dello stesso tipo
struttura, ma quello che di solito sfugge e` che due tipi struttura che differiscono
solo per il nome sono considerati diversi:
// con riferimento al tipo Data visto sopra:
struct DT {
unsigned short Giorno, Mese;
unsigned Anno;
};
Data Oggi = { 10, 11, 1996 };
DT Ieri;
Ieri = Oggi; // Errore di tipo!
|