prof. Nunzio Brugaletta Programmazione e linguaggio C

EnneBi - Programmazione
Avanti Indietro Inizio


4.9 Due osservazioni. Il qualificatore const

Sono necessarie due osservazioni sulla codifica effettuata:

  1. La trasposizione in codifica delle singole fasi dell’elaborazione è stata effettuata con una combinazione di commenti e funzioni. Le funzioni avrebbero potuto essere di più: per esempio tante quante sono le parti in cui si è scomposto il programma. La scelta effettuata in questo caso ha tenuto conto del fatto di evitare una estrema polverizzazione in funzioni che avrebbe reso più difficoltosa la comprensione dell’algoritmo utilizzato per la risoluzione del problema. Quando si trattava di poche istruzioni, queste sono state inglobate nel programma principale. È bene ripetere che questa o altra scelta che è possibile effettuare, dipende dal modo come il programmatore intende organizzare le diverse fasi di lavoro. Bisogna in ogni caso ricordare che ogni parte del programma deve esprimere chiaramente quello che fa; organizzare il programma in modo che sia chiaro cosa si fa e dove ed inoltre ogni fase di lavoro deve quanto più possibile essere isolata.

  1. L’utilizzo della costante globale RILEVAZ rende dipendenti le funzioni da tale costante rendendo più problematico il riutilizzo delle funzioni stesse e il rintracciamento di eventuali errori.

È possibile dichiarare le costanti anche all’interno di una funzione utilizzando la parola chiave const. Es:

Programma A

Programma B

...
#define RILEVAZ 12
...
main(){
...
...
main(){
const int RILEVAZ = 12;
...

Quella espressa nel Programma A non è una vera e propria istruzione ma una direttiva al preprocessore. Prima della compilazione viene effettuata una sostituzione: tutte le ricorrenze di RILEVAZ sono sostituite col valore 12 e quindi viene effettuata la compilazione. RILEVAZ, praticamente, nel programma e in memoria non esiste. Le direttive al preprocessore sono azioni da svolgere prima di passare alla compilazione del programma. Anche #include <stdio.h> è una direttiva al preprocessore: essa ordina di includere nel programma lo header stdio.h prima di procedere alla compilazione.

Nel Programma B viene invece dichiarata una variabile di tipo int che contiene il valore 12. Il qualificatore const avvisa che il contenuto della variabile associata non può essere modificato.

Se si utilizza la via suggerita dal Programma B, le funzioni non possono conoscere la quantità degli elementi presenti nel vettore (la dichiarazione è locale): è necessario prevedere un ulteriore parametro che consenta di poter passare alle funzioni tale informazione. Le funzioni che elaborano il vettore conterranno, nella definizione, un nuovo parametro che consenta di ricevere il valore della quantità di elementi presenti nel vettore stesso.

L’uso della costante globale se da una parte rende le funzioni dipendenti da tale dichiarazione, dall’altra permette di semplificare il passaggio di parametri tra funzioni (si ha necessità di un parametro in meno).

Un uso interessante del qualificatore const consiste nell’eliminazione di una limitazione più volte messa in evidenza: il passaggio, necessariamente per riferimento, di un vettore alle funzioni. Basta specificare const per avvisare che il vettore non deve essere modificato. In pratica il vettore viene passato per valore.

Es.

void rilevaTemp(int *t); 
void aggiorna(const int *t,int *st,int *tmn,int *tmx); 
float scostMed(const int *t,float mt); 

Alla prima funzione viene passato il riferimento all’array. Il compito di tale funzione è infatti quello di riempire l’array con i dati provenienti dall’input.

Le funzioni aggiorna e scostMed non modificano l’array, è quindi giusto che se ne impedisca una modifica anche accidentale: l’array in questi casi è un input.

Nonostante si passi alla funzione un puntatore, quindi un indirizzo di memoria, la const impedisce la modifica del valore puntato.



Avanti Indietro Inizio

http://ennebi.solira.org ennebi@solira.org