Sei sulla pagina 1di 40

Funzioni in C

Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Funzioni, Stack e Visibilit delle Variabili in C


Programmazione I e Laboratorio
Corso di Laurea in Informatica
A.A. 2016/2017

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Calendario delle lezioni

Lez. 1 - Introduzione allambiente Linux


Lez. 2 - Introduzione al C
Lez. 3 - Tipi primitivi e costrutti condizionali
Lez. 4 - Costrutti iterativi ed array
Lez. 5 - Funzioni, stack e visibilita variabili
Lez. 6 - Puntatori e memoria
Lez. 7 - Tipi di dati utente
Lez. 8 - Liste concatenate e librerie

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Sommario
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Outline
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Funzioni in C
Per definire un programma complesso necessario dividerlo in
parti separate: modularizzazioni.
Una funzione permette di definire una sorta di sottoprogramma
con:
parametri in ingresso;
parametri in uscita.
La scrittura di un programma in funzioni (astrazione
funzionale) consente di realizzare e riusare operazioni
complesse definendole come funzioni da invocare quando
necessario.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Funzioni in C (2)
Un programma C definito come un insieme di funzioni (una
obbligatoria, il main).
Una funzione prende in ingresso un insieme di argomenti e
ritorna un (unico) valore.
Vedremo di seguito:
Come si definiscono le funzioni (definizione di funzione);
Come si usano le funzioni (chiamata o attivazione di
funzione).

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Un primo esempio
Programma con una funzione square per calcolare il quadrato
di un numero.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Outline
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Dichiarazione di Funzioni
Come le variabili devono essere dichiarate prima di poter
essere usate, anche le funzioni necessitano di una
dichiarazione.

La dichiarazione di una funzione dovr specificare:


1
Il nome della funzione: identificatore che ne permetter
lutilizzo nel programma;
2
Gli argomenti (parametri) della funzione: quantit e tipo
dei valori forniti in ingresso;
3
Il tipo del valore in uscita.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Sintassi della dichiarazione


La sintassi della dichiarazione di funzione (prototipo) la
seguente:

Identificatore tipo specifica il tipo del valore del


risultato. Identificatore specifica il nome della funzione.
Lista tipo parametri formali specifica il tipo dei
parametri di input: tipo1 nome1, tipo2, nome2, . . ., tipoN
nomeN. Il nome dei parametri nel prototipo facoltativo.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Esempi di dichiarazione
Prototipi:

Il nome del parametro pu essere incluso nel prototipo per


documentare meglio il programma, comunque sar ignorato dal
compilatore.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Tipo void
Esistono funzioni che non producono alcun effetto (es.
funzione di stampa)
Il linguaggio C mette a disposizione un tipo speciale void:

E il prototipo di una funzione che non restituisce nessun


output. Per esempio la sua definzione pu essere la seguente:

Il tipo void viene utilizzato anche per specificare lassenza di


argomenti: le dichiarazioni int f(void); e int f(); sono equivalenti.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Outline
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Definizione di Funzioni
La definizione di una funzione specifica cosa fa una funzione e
come lo fa: contiene la sequenza di istruzioni che dovr essere
eseguita per ottenere il valore risultato a partire dai dati in
ingresso (una sorta di sottoprogramma).
La definizione di una funzione consta di due parti fondamentali:
1

Intestazione: simile alla dichiarazione (per necessaria la


specifica dei nomi dei parametri);

Blocco: del tutto simile al blocco gi introdotto per la


funzione main() e pu contenere istruzioni e dichiarazioni
di variabili (nota: non di funzioni!).

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Esempio di definizione
Vediamo un esempio semplice di definizone di funzione in C:

Attenzione: se si omette di indicare il tipo del parametro


formale questo viene assunto int.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Sintassi della definizione


La sintassi di una dichiarazione di funzione la seguente:
intestazione blocco.
Blocco il corpo della funzione (codice). Lintestazione ha la
forma seguente:

identificatore tipo specifica il tipo del valore di ritorno,


se manca viene assunto int. identificatore specifica il
nome della funzione. lista parametri formali
specifica una lista di dichiarazioni di parametri (tipo nome)
separate da virgola (la lista pu essere vuota).

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Esempio di definizione di una funzione

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Outline
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Attivazione di funzioni
Le funzioni vengono chiamate (attivate) allinterno di funzioni.

Sintassi di attivazione di una funzione:

Identificatore il nome della funzione.


lista parametri attuali una lista di espressioni
separate da virgola. I parametri attuali devono corrispondere in
numero e tipo ai parametri formali.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Coercizione degli argomenti


Una chiamata di funzione che non corrisponda al prototipo
provocher un errore di sintassi.

In alcuni casi tollerate chiamate con tipi diversi: coercizione


degli argomenti.
Esempio: sqrt ha come argomento un double, se per:

Il compilatore promuove il valore intero 4 al valore double 4.0


quindi la funzione viene chiamata correttamente.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Semantica dellattivazione

Semantica della Attivazione Funzione di una funzione B in una


funzione A:
1
2

Lattivazione di una funzione unespressione;


Lattivazione di B da A determina:
viene sospesa lesecuzione di A e si passa ad eseguire le
istruzioni di B (a partire dalla prima).

Prima di poter essere attivata una funzione deve essere


definita (o dichiarata).

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Deve si definisce una funzione


In C non si possono definire funzioni dentro funzioni. Quindi si
definiscono fuori dalla funzione main() (sopra o sotto).

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Funzioni ricorsive
Una funzione che, nel proprio blocco di codice, invoca (anche)
se stessa.
int fibonacci ( int i )
{
int ris ;
i f ( i == 0 )
r i s = 0;
e l s e i f ( i == 1 )
ris = 1 ;
else
r i s = f i b o n a c c i ( i 1) + f i b o n a c c i ( i 2) ;
return r i s ;
}

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Outline
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Visibilit delle funzioni


Prima di essere attivata una funzione deve essere definita o
dichiarata. Il compilatore deve controllare che i parametri
formali corrispondano (per numero e tipo) ai parametri attuali.
Prima dellattivazione deve essere conosciuto il prototipo:

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Visibilit delle funzioni (2)


Se la funzione non definita almeno deve essere gi
dichiarata:

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Ordine di dichiarazione
Ogni funzione deve essere stata dichiarata prima di essere
usata. E pratica comune specificare in questordine:
1
Dichiarazione di tutte le funzioni con esclusione del main;
2
Definizione del main;
3
Definizione di tutte le altre funzioni.
In questo modo ogni funzione stata dichiarata prima di essere
usata:

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

File di intestazione (Header)


Ogni libreria standard ha un corrispondente file header che
contiene:
definizioni di costanti;
definizioni di tipo;
dichiarazioni di tutte le funzioni della libreria.

Possono essere scritte dal programmatore "mialib.h".

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Regole di visibilit
Ogni dichiarazione del linguaggio C ha un suo campo di
visibilit. Visibilit detta nel file:
Lidentificatore dichiarato allesterno di ogni funzione:
Lidentificatore sar noto in tutte le funzioni la cui
definizione successiva;
Lidentificatore detto identificatore globale.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Regole di visibilit (2)


Visibilit detta nel blocco: identificatore dichiarato in un
blocco e limitata al blocco stesso:

Le variabili dichiarate nel blocco istruzioni di una funzione sono


dette variabili locali (allocate nello stack), quindi riferibili solo
nel corpo della funzione.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Regole di visibilit (3)


Visibilit detta nel blocco: i parametri formali di una funzione
sono considerati come variabili locali: visibili solo nel blocco
della funzione. Nota: non definire parametri con stesso
identificatore; non definire una variabile locale con il nome di
parametro:

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Mascheramento
Il mascheramento si ha quando in un blocco si dichiara un
identificatore gi dichiarato fuori dal blocco ed in esso visibile.
La dichiarazione interna maschera quella esterna:

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Tempo di vita di una variabile


Le variabili locali (le locazioni di memoria associate) vengono:
Create al momento dellattivazione di una funzione;
Distrutte al momento delluscita dallattivazione.
Da questo segue che:
la funzione chiamante non pu riferirsi ad una variabile
locale alla chiamata;
ad attivazioni successive di una stessa funzione
corrispondono variabili (locazioni di memoria) diverse.
Nota: il tempo di vita di una variabile un concetto rilevante a
run-time.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Outline
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Gestione della memoria virtuale a run-time


Codice macchina e dati entrambi in memoria principale, ma in
zone separate:
Memoria per il codice macchina fissato a tempo di
compilazione;
Memoria per dati locali alle funzioni (variabili e parametri)
cresce e decresce dinamicamente durante lesecuzione:
gestito a pila (stack).
Durante lesecuzione del programma viene gestita lo stack dei
record di attivazione (RDA):
per ogni attivazione di funzione viene allocato un RDA in
cima allo stack;
al termine dellattivazione della funzione il RDA viene
rimosso.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Record di attivazione
Ogni RDA contiene: a) le locazioni di memoria dei parametri
formali (se presenti), b) le locazioni di memoria per le variabili
locali (se presenti), c) lindirizzo di ritorno (indirizzo della
prossima istruzione della funzione chiamante). Allinizio
dellesecuzione presente nello stack solo il RDA della funzione
main. Se durante lesecuzione viene attivata una funzione f(),
viene creato ed aggiunto allo stack il RDA corrispondente.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Record di attivazione
Ogni RDA contiene: a) le locazioni di memoria dei parametri
formali (se presenti), b) le locazioni di memoria per le variabili
locali (se presenti), c) lindirizzo di ritorno (indirizzo della
prossima istruzione della funzione chiamante).
Allinizio dellesecuzione presente nello stack solo il RDA della
funzione main. Se durante lesecuzione viene attivata una
funzione f(), viene creato ed aggiunto allo stack il RDA
corrispondente.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Outline
1

Funzioni in C

Dichiarazione di Funzioni in C

Definizione delle Funzioni in C

Chiamata a Funzione

Regole di Visibilit

Cenni al funzionamento dello Stack

Esercizi

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Esercizi
Trovate 7 esercizi nella piattaforma di autovalutazione:
Esercizio 1: Funzione Media;
Esercizio 2: Funzione Multipli;
Esercizio 3: Somma di Potenze;
Esercizio 4: MCD e mcm;
Esercizio 5: Metodo Babilonese.
Esercizio 6: Calcolo Pi Greco.
Esercizio 7: Numeri maggiori.

Funzioni in C
Dichiarazione di Funzioni in C
Definizione delle Funzioni in C
Chiamata a Funzione
Regole di Visibilit
Cenni al funzionamento dello Stack
Esercizi

Esercizio 1: passaggio di array ad una funzione

Un array (identificato dallindirizzo in memoria del suo primo


elemento) pu essere passato come parametro ad una
funzione come qualsiasi altra variabile:
Esempio: funzione(int array[], . . .);
Oppure: funzione(int array, . . .);