Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 26 di 47
  • livello principiante
Indice lezioni

Casting, enumerazioni e variabili statiche in C

Modificare il tipo di dato di un valore, associare valori mnemonici ad una enumerazione e gestire variabili statiche
Modificare il tipo di dato di un valore, associare valori mnemonici ad una enumerazione e gestire variabili statiche
Link copiato negli appunti

In questa lezione sul linguaggio C vediamo come effettuare conversioni tra i tipi di dati, come creare collegare enumerazioni a nomi mnemonici e come usare le variabili statiche.

C cast: Il Casting

Quando si lavora con tipi di dati diversi tra loro, che siano primitivi (int, char, float, etc.) o avanzati, può essere necessario convertire valori da un tipo ad un altro. Questa operazione si chiama casting, ad assume il nome di coercizione (coercion) quando si forza la conversione esplicita di un tipo ad un altro tipo, conversione magari non prevista automaticamente.

In C, per convertire esplicitamente un tipo ad un altro tipo, si usa l'operatore ( ), queste parentesi tonde prendono il nome di operatore di cast; all'interno delle parentesi bisogna mettere il nuovo tipo al quale vogliamo passare, e fuori il valore che si vuole modificare.

// Casting da float ad int
int numero;
float reale;

reale = 47.19;
numero = (int)reale; // vale 47 

Ad esempio è possibile forzare la conversione di tipo dal tipo float al tipo int, o dal tipo char al tipo int.

// Casting da int a float
// ----------------------
int numero;
float reale;

numero = 18;
reale = (float)numero;

// Casting da char ad int
// ----------------------
int numero;
char lettera;

lettera = 'A';
numero = (int)lettera; // vale 65, il valore ASCII di A 

alcune conversioni di tipo vengono eseguite automaticamente (casting implicito), generalmente quando si utilizzano tipi di altro tipo come int. È possibile, e consigliabile, utilizzare l'operatore di casting anche quando si compiono operazioni sui valori come, ad esempio, la divisione:

int primo;
int secondo;
float ris_div;

ris_div = (float)primo / (float)secondo; 

Comunque la regola dice che se si è nel dubbio bisogna sempre mettere l'operatore di cast, ovvero bisogna sempre convertire esplicitamente i tipi. Il casting è e rimane un'operazione potente che, se ben utilizzata, può apportare notevoli benefici ad un programma.

C enum: Le enumerazioni

Il tipo enumerazione è abbastanza particolare, perché permette di associare a delle costanti letterali, un valore intero; in questo modo possiamo utilizzare tali nomi per identificare il loro valore; facciamo un esempio utilizzando i giorni della settimana:

enum giorni { lun, mar, mer, gio, ven, sab, dom } settimana;

In questo caso abbiamo definito una nuova variabile di nome settimana e di tipo enumerazione giorni; l'identificatore lun assume il valore 0, mar assume il valore 1, e così via; in poche parole si ha un indice iniziale 0 e gli altri assumono una numerazione progressiva. Questo ci può essere molto utile se dobbiamo scrivere un programma che operi sui giorni della settimana (come un calendario); se non esistesse il tipo enumerazione il programma non potrebbe assegnare alcun "valore" ad un determinato giorno e quindi sarebbe molto più difficile (e dispendioso in termini di codice) lavorare in tal senso.

È possibile, però, assegnare alle costanti anche valori iniziali diversi da 0, o valori non numerici, come spiegato nei due esempi:

// valori non numerici
enum seq_escape { suono = 'a', cancella = 'b', tab = 't', invio = 'r' };

// indice iniziale diverso da 0
enum mesi { gen = 1, feb, mar, apr, mag, giu, lug, ago, set, ott, nov, dic }; 

che implica feb uguale a 2, mar uguale a 3, e così via.

Variabili statiche in C

La variabili hanno la possibilità di essere visibili solo in una funzione (variabili locali) o in tutto il programma (variabili globali). Le variabili locali possono avere un'altra caratteristica, possono essere statiche, ovvero, essere definite una volta, ed avere vita propria all'interno di una funzione, con il vantaggio di mantenere il loro valore intatto, cioè il valore che una variabile statica ha all'uscita delle funzione è il medesimo quando si rientra (richiamandola) nella funzione stessa. La parola chiave che identifica le variabili statiche è static e deve essere messa prima del tipo della variabile. Come mostrato nell'esempio, vengono definite due variabili in una funzione, una statica ed una non:

#include 

// prototipo della funzione
void stampa();

int main()
{
   int i;
   for(i=0; i<5; i++) stampa();
}

void stampa()
{
   int alfa = 0;
   static int beta = 0;
   printf("(int) alfa = %d, (static int) beta = %d n", alfa, beta);
   ++alfa;
   ++beta;
} 

L'esecuzione del programma genere il seguente output a video:

(int) alfa = 0, (static int) beta = 0
(int) alfa = 0, (static int) beta = 1
(int) alfa = 0, (static int) beta = 2
(int) alfa = 0, (static int) beta = 3
(int) alfa = 0, (static int) beta = 4 

Esempio pratico

(Visualizza il sorgente completo)

All'interno del programma abbiamo dovuto creare un nuovo tipo, di nome "t_contatto", che contenesse i dati sensibili (nome, cognome, telefono, email, sitoweb); questo è stato possibile grazie all'uso congiunto di typedef e di una struttura.

Le variabili all'interno sono tutte stringhe (array di caratteri), ma potevano esserci tranquillamente int, float ed altritipi di dato.

28      // Creo la struttura per contenere i contatti
29      typedef struct
30      {
31        char nome[50];
32        char cognome[50];
33        char telefono[30];
34        char email[100];
35        char sitoweb[200];
36      } t_contatto; 

Ti consigliamo anche