----------------------------

                           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



    Source: geocities.com/it/songbook2003

               ( geocities.com/it)