Barninga Z
a- a+

Le funzioni

La funzione è l'unità elaborativa fondamentale dei programmi C. Dal punto di vista tecnico essa è un blocco di codice a sé stante, isolato dal resto del programma, in grado di eseguire un particolare compito. Essa riceve dati e fornisce un risultato: ciò che avviene al suo interno è sconosciuto alla rimanente parte del programma, con la quale non vi è mai alcuna interazione.

Ogni programma C si articola per funzioni: esso è, in altre parole, un insieme di funzioni. Tuttavia, nonostante l'importanza che le funzioni hanno all'interno di un qualunque programma C, l'unica regola relativa al loro numero e al loro nome è che deve essere presente almeno una funzione ed almeno una delle funzioni deve chiamarsi main(). L'esecuzione del programma inizia proprio con la prima istruzione contenuta nella funzione main(); questa può chiamare altre funzioni, che a loro volta ne possono chiamare altre ancora. L'unico limite è rappresentato dalla quantità di memoria disponibile.

Tutte le funzioni sono reciprocamente indipendenti e si collocano al medesimo livello gerarchico, nel senso che non vi sono funzioni più importanti di altre o dotate, in qualche modo, di diritti di precedenza: la sola eccezione a questa regola è rappresentata proprio da main(), in quanto essa deve obbligatoriamente esistere ed è sempre chiamata per prima.

Quando una funzione ne chiama un'altra, il controllo dell'esecuzione passa a quest'ultima che, al termine del proprio codice, o in corrispondenza dell'istruzione return lo restituisce alla chiamante. Ogni funzione può chiamare anche se stessa, secondo una tecnica detta ricorsione.

In generale, è utile suddividere l'algoritmo in parti bene definite, e codificare ciascuna di esse mediante una funzione dedicata; ciò può rivelarsi particolarmente opportuno soprattutto per quelle parti di elaborazione che devono essere ripetute più volte, magari su dati differenti. La ripetitività non è però l'unico criterio che conduce ad individuare porzioni di codice atte ad essere racchiuse in funzioni: l'importante, come si è accennato, è isolare compiti logicamente indipendenti dal resto del programma; è infatti usuale, in C, definire funzioni che nel corso dell'esecuzione vegono chiamate una volta sola.

Vediamo più da vicino una chiamata a funzione:

#include 

void main(void);

void main(void)
{
    printf("Esempio di chiamata.
");
}

 

Nel programma di esempio abbiamo una chiamata alla funzione di libreria printf()[1]. Ogni compilatore C è accompagnato da uno o più file, detti librerie, contenenti funzioni già compilate e pronte all'uso, che è possibile chiamare dall'interno dei programmi: printf() è una di queste. In un programma è comunque possibile definire, cioè scrivere, un numero illimitato di funzioni, che potranno essere chiamate da funzioni dello stesso programma[2]. L'elemento che caratterizza una chiamata a funzione è la presenza delle parentesi tonde aperta e chiusa alla destra del suo nome. Per il compilatore C, un nome seguito da una coppia di parentesi tonde è sempre una chiamata a funzione. Tra le parentesi vengono indicati i dati su cui la funzione lavora: è evidente che se la funzione chiamata non necessita ricevere dati dalla chiamante, tra le parentesi non viene specificato alcun parametro:

#include 
#include 

void main(void);

void main(void)
{
    char ch;

    printf("Premere un tasto:
");
    ch = getch();
    printf("E' stato premuto %c
" ,ch);
}

 

Nell'esempio è utilizzata la funzione getch(), che sospende l'esecuzione del programma ed attende la pressione di un tasto: come si vede essa è chiamata senza specificare alcun parametro tra le parentesi.

Inoltre getch() restituisce il codice ASCII del tasto premuto alla funzione chiamante: tale valore è memorizzato in ch mediante una normale operazione di assegnamento. In generale, una funzione può restituire un valore alla chiamante; in tal caso la chiamata a funzione è trattata come una qualsiasi espressione che restituisca un valore di un certo tipo: nell'esempio appena visto, infatti, la chiamata a getch() potrebbe essere passata direttamente a printf() come parametro.

#include 
#include 

void main(void);

void main(void)
{
    printf("Premere un tasto:
");
    printf("E' stato premuto %c
" ,getch());
}

 

Dal momento che in C la valutazione di espressioni nidificate avviene sempre dall'interno verso l'esterno, in questo caso dapprima è chiamata getch() e il valore da essa restituito è poi passato a printf(), che viene perciò chiamata solo al ritorno da getch().

Dal punto di vista elaborativo la chiamata ad una funzione è il trasferimento dell'esecuzione al blocco di codice che la costituisce. Della funzione chiamante, la funzione chiamata conosce esclusivamente i parametri che quella le passa; a sua volta, la funzione chiamante conosce, della funzione chiamata, esclusivamente il tipo di parametri che essa si aspetta e riceve, se previsto, un valore (uno ed uno solo) di ritorno. Tale valore può essere considerato il risultato di un'espressione e come tale, lo si è visto, passato ad un altra funzione o memorizzato in una variabile, ma può anche essere ignorato: printf() restituisce il numero di caratteri visualizzati, ma negli esempi precedenti tale valore è stato ignorato (semplicemente non utilizzandolo in alcun modo) poiché non risultava utile nell'elaborazione effettuata.

Sotto l'aspetto formale, dunque, è lecito attendersi che ogni funzione richieda un certo numero di parametri, di tipo noto, e restituisca o no un valore, anch'esso di tipo conosciuto a priori. In effetti le cose stanno proprio così: numero e tipo di parametri e tipo del valore di ritorno sono stabiliti nella definizione della funzione.

 



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Redazione
Condividi le tue opinioni su questo articolo!