Programmare in C – Funzioni

La maggior parte dei linguaggi consente di creare funzioni. Le funzioni permettono di suddividere un programma lungo in sezioni ognuna con un nome, in modo che queste sezioni siano riutilizzabili all'occorrenza all'interno del programma. Le funzioni accettano parametri e restituiscono risultati.

Le funzioni in C possono accettare in input un numero illimitato di paramentri. In generale, al C non importa in quale ordine si indicano le funzioni nel programma. Abbiamo già introdotto la nozione di funzione. La funzione rand vista nelle lezioni precedenti è una delle funzioni più semplici che si possono creare. Non accetta parametri e ritorna un intero come risultato, eccola qui riproposta per maggiore chiarezza.

int rand()
/* from K&R
   - produces a random number between 0 and 32767.*/
{
    rand_seed = rand_seed * 1103515245 +12345;
    return (unsigned int)(rand_seed / 65536) % 32768;
}

La linea int rand() dichiara la funzione rand in modo che sia nota al resto del programma e specifica che la funzione rand non accetterà alcun parametro e restituirà un intero come risultato. Questa funzione non ha variabili locali. Se occorresse utilizzare variabili locali andrebbero esattamente sotto la parentesi graffa aperta (in C si possono dichiarare variabili locali dopo ogni parentesi graffa aperta {. Sono variabili “locali” perchè esistono nella memoria del calcolatore finchè non si incontra la relativa parentesi graffa chiusa }).

Mentre “esistono”, le variabili locali “vivono” nella memoria stack. Da notare che dopo la coppia di parentesi tonde aperte () nella prima linea non compare il punto e virgola che di solito denota il termine dell'istruzione. Se si introduce il punto e virgola il compilatore genererà un nutrito numero di errori molti dei quali senza senso. Da notare inoltre che sono necessarie le parentesi () anche se non vi sono parametri in input. Infatti, le parentesi indicano al compilatore che si sta dichiarando/definendo una funzione.

L'istruzione return è importante per ogni funzione che restituisce un risultato. Il return specifica il valore che la funzione dovrà restituire e provoca l'uscita immediata dalla funzione stessa. Ciò significa che si possono mettere più istruzioni return in una funzione e dotare quindi la funzioni di più punti di uscita possibili. Se non si indica esplicitamente l'istruzione return in una funzione, l'esecuzione della funzione terminerà quando viene raggiunta la parentesi } e restituirà un valore random (esistono alcuni compilatori che indicheranno di fare attenzione – segnaleranno un cosiddetto warning – perchè è assente un valore specifico per il return). In C una funzione può restituire valori di qualsiasi tipo: int, float, char, struct, e così via.

Ci sono vari modi ugualmente corretti per utilizzare la funzione rand nel programma. Per esempio si può usare x=rand();

Alla variabile x viene assegnato il valore restituito da rand. Da notare che si deve necessariamente utilizzare le parentesi tonde () nella chiamata della funzione, anche se non ci sono parametri da passare. Se non si fa ciò, il compilatore interpreta l'istruzione come “assegna ad x l'indirizzo di memoria della funzione rand”, cosa che è tipicamente molto diversa da quello che si intende fare.
Si può inoltre chiamare la funzione così:

if (rand() > 100)

oppure 
rand();

Nell'ultimo caso, la funzione viene chiamata ma non viene memorizzato il valore restituito. Dato il significato della funzione rand è abbastanza improbabile un uso di questo tipo, ma molte funzioni potrebbero essere usate senza dare particolare importanza al valore da esse restituito.
Le funzioni che utilizzano come tipo di dato da restituire void non restituiscono nulla. Ad esempio:

void print_header()
{
    printf("Program Number 1\n");
    printf("by Marshall Brain\n");
    printf("Version 1.0, released 12/26/91\n");
}

La funzione di cui sopra non restituisce valori. Si può quindi richiamarla così:
print_header();
E' necessario però includere () nella chiamata alla funzione. Se non si utilizzano le parentesi tonde (), è possibile che il compilatore non segnali errori e durante l'esecuzione la funzione non venga poi eseguita.
Le funzioni in C possono accettare parametri di ogni tipo: Per esempio:

int fact(int i)
{
    int j,k;

    j=1;
    for (k=2; k<=i; k++)
        j=j*k;
    return j;
}

La funzione ritorna il fattoriale di i, che viene passato come parametro di tipo intero. Se la funzione accetta più parametri in input basterà separarli con una virgola:

int add (int i, int j)
{
    return i+j;
}

Il C si è evoluto nel tempo. Non è pertanto raro trovare la definizione di funzioni alla vecchia maniera, soprattutto nei codici sorgenti che esistono da vari anni, così come mostrato qui:

int add(i,j)
    int i;
    int j;
{
    return i+j;
}

E' importante saper leggere anche il codice “vecchia maniera”. Non vi è nessuna differenza di funzionamento durante l'esecuzione, è solo la sintassi che è diversa. Si dovrebbe usare comunque il nuovo stile (ANSI C), con la lista dei parametri il cui tipo è indicato fra parentesi. Un'eccezione potrebbe essere quando si sa che si deve far utilizzare il codice sorgente a qualcuno che non dispone di un compilatore non-ANSI, quindi un compilatore che capisce solamente la vecchia sintassi.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend