----------------------------
The C programming's book
Lessons #04
----------------------------
LE COSTANTI
------------
Cos'è una costante lo dice la parola stessa. E' anch'esso una sorta
di contenitore (come le variabili) il cui valore però (a differenza
delle variabili) non cambia mai, rimane costante. Questo perchè il
programma non ha un nome simbolico a cui far riferimento.
Il primo tipo di costanti che andremo ad analizzare sono le costanti
manifeste (o manifest costants).
Mettiamo di voler fare un programma che calcoli l'area del cerchio.
come tutti sanno la formula dell'area del cerchio è pi greco per
raggio alla seconda dove pi greco è un valore costante fissato a 3.14
Può essere conveniente utilizzare una costante per definire pi greco
in modo da non dover riscriverlo ogni qual volte ce n'è bisogno. E'
possibile farlo con la direttiva #definie in questo modo:
#definie PI_GRECO 3.24 /* Valore di pi greco */
Quindi prima #definie poi il nome della costante e poi il suo valo-
re. Per chiarire meglio le idee faccio altri esempi:
#define NOME_PROGRAMMA "Programmone v1.0"
#define AUTHOR "sHaDy"
#define ANNO_SOLARE 365
#define RETURN 0x0D //ritorno a capo
#define VIDEO_ADDRESS 0xB8000000L //indirizzo del buffer video
Chiaro? Fatemolta attenzione al fatto che il cancelletto "#" deve
trovarsi sulla prima colonna (non deve essere preceduto da niente)
L'uso delle maiuscole non è obbligatorio ma consente di individuar-
le meglio ed è quindi diventato uno "standard" tra i programmatori.
Grazie alle costanti manifeste è anche possibile creare delle
formule dette macro:
#define MINIMO ((a < b) ? a : b)
In questo esempio la macro serve a trovare il minimo tra due numeri.
Le macro però anno anche diversi effetti collaterali dovuti al fatto
che il compilatore non esegue controlli ma su questo non voglio
dilungarmi troppo (almeno non ora).
Per stampare a schermo il contenuto di una variabile si procede con
il solito printf:
#define PROVA "ciao"
#define NUMERO 333
printf(PROVA);
printf("NUMERO");
Senza virgolette o apici in quanto sono già presenti nella stringa
associata a PROVA mentre con le virgolette per NUMERO. E' possibile
annullare una direttiva #definie con #undef:
#define PROVA "ciao"
...
printf(PROVA);
...
#undef PROVA
...
printf(PROVA);
/*messaggio di errore in
quanto PROVA non esiste più*/
E' anche possibile escludere dalla compilazione una parte del codice
con #ifdef #else e #endif nella maniera seguente:
#define CIAO
...
#ifdef CIAO
... //questa parte viene compilata
#else
... //questa no perchè CIAO è definita
#endif
associata a PROVA mentre con le virgolette per NUMERO. E' possibile
Le costanti manifeste non sono troppo utilizzare proprio per i loro
effetti collaterali ma soprattutto per il fatto che sono molto scomo-
de in fase di debug: bisogna ogni volta andarle a cercare e diventa
un bel macello. E qui si passa al secondo tipo di costanti: le
costanti simboliche. Queste ultime si dichiarano analogamente ad una
variabile ma antecedendo la parola const:
const tipo nome_costante = valore;
Procediamo con gli esempi:
const int pi_greco = 3.14;
const char return = 0x0D;
Se ora proviamo a cambiare il valore alla costante appena dichiarata
otteniamo un messaggio di errore da parte del compilatore.
Il principale vantaggio offerto da const è che risulta possibile acce-
dere (in sola lettura) al valore delle costanti così dichiarate
mediante l'indirizzo delle medesime (come accade per tutte le aree di
memoria associate a nomi simbolici).
Infine, le costanti simboliche possono essere gestite dai debugger pro-
prio come se fossero variabili e questo è un notevole vantaggio.
Written by Shady
robcasanovi@virgilio.it
               (
geocities.com/it)