Funzioni, Stack e Visibilità delle Variabili in C

Documenti analoghi
Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Linguaggio C: le funzioni. Introduzione e sintassi

Definizione di metodi in Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti

Primi passi col linguaggio C

Unità F1. Obiettivi. Il linguaggio C. Il linguaggio C++ Linguaggio C. Pseudolinguaggio. Primi programmi

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Linguaggio C - sezione dichiarativa: costanti e variabili

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Linguaggio C: introduzione

Strutture dati e loro organizzazione. Gabriella Trucco

L Allocazione Dinamica della Memoria

Funzioni. Corso di Fondamenti di Informatica

Le direttive del Preprocessore

Introduzione alla programmazione. Walter Didimo

Introduzione al C. Introduzione. Linguaggio ad alto livello. Struttura di un programma C

Linguaggi di alto livello, compilatori e interpreti

Gestione della Memoria

Il linguaggio C. Notate che...

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

IL PRIMO PROGRAMMA IN C

ACSO Programmazione di Sistema e Concorrente

UD 3.2b: Programmazione in Pascal (1)

Allocazione dinamica della memoria

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Programmazione in Java (I modulo)

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Introduzione a Java. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Gestione delle eccezioni in Java

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Algoritmi e basi del C Struttura di un programma

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

Le basi del linguaggio Java

Linguaggi di Programmazione

4 GLI ARRAY E LE STRINGHE

Fondamenti di Programmazione

STRUTTURA DI UN PROGRAMMA

Cosa si intende con stato

Modelli di interazione tra processi

Strutture Dinamiche. Fondamenti di Informatica

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Programmazione ad Oggetti

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Esercizio 1 Liste: calcolo perimetro di un poligono

Allocazione Dinamica della Memoria

Fasi di un Compilatore

Programmazione C Massimo Callisto De Donato

Informatica Generale Andrea Corradini I linguaggi di programmazione

Modelli di interazione tra processi

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

Laboratorio di programmazione

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Esempio di Prova Scritta

Espressione di chiamata di funzione

LINGUAGGI DI ALTO LIVELLO

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software

Transcript:

Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017

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

Sommario Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

Outline Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

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.

(2) Funzioni in C 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).

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

Outline Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

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à l utilizzo nel programma; 2 Gli argomenti (parametri) della funzione: quantità e tipo dei valori forniti in ingresso; 3 Il tipo del valore in uscita.

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.

Esempi di dichiarazione Prototipi: Il nome del parametro può essere incluso nel prototipo per documentare meglio il programma, comunque sarà ignorato dal compilatore.

Tipo void Funzioni in C 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 l assenza di argomenti: le dichiarazioni int f(void); e int f(); sono equivalenti.

Outline Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

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); 2 Blocco: del tutto simile al blocco già introdotto per la funzione main() e può contenere istruzioni e dichiarazioni di variabili (nota: non di funzioni!).

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.

Sintassi della definizione La sintassi di una dichiarazione di funzione è la seguente: intestazione blocco. Blocco è il corpo della funzione (codice). L intestazione 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).

Esempio di definizione di una funzione

Outline Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

Attivazione di funzioni Le funzioni vengono chiamate (attivate) all interno 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.

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.

Semantica dell attivazione Semantica della Attivazione Funzione di una funzione B in una funzione A: 1 L attivazione di una funzione è un espressione; 2 L attivazione di B da A determina: viene sospesa l esecuzione 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).

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 ricorsive Funzioni in C Una funzione che, nel proprio blocco di codice, invoca (anche) se stessa. i n t f i b o n a c c i ( i n t i ) { i n t r i s ; i f ( i == 0) r i s = 0; else i f ( i == 1) r i s = 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) ; r e t u r n r i s ; }

Outline Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

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 dell attivazione deve essere conosciuto il prototipo:

Visibilità delle funzioni (2) Se la funzione non è definita almeno deve essere già dichiarata:

Ordine di dichiarazione Ogni funzione deve essere stata dichiarata prima di essere usata. E pratica comune specificare in quest ordine: 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:

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".

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

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.

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:

Mascheramento Funzioni in C 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:

Tempo di vita di una variabile Le variabili locali (le locazioni di memoria associate) vengono: Create al momento dell attivazione di una funzione; Distrutte al momento dell uscita dall attivazione. 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.

Outline Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

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 l esecuzione: gestito a pila (stack). Durante l esecuzione 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 dell attivazione della funzione il RDA viene rimosso.

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) l indirizzo di ritorno (indirizzo della prossima istruzione della funzione chiamante). All inizio dell esecuzione presente nello stack solo il RDA della funzione main. Se durante l esecuzione viene attivata una funzione f(), viene creato ed aggiunto allo stack il RDA corrispondente.

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) l indirizzo di ritorno (indirizzo della prossima istruzione della funzione chiamante). All inizio dell esecuzione presente nello stack solo il RDA della funzione main. Se durante l esecuzione viene attivata una funzione f(), viene creato ed aggiunto allo stack il RDA corrispondente.

Outline Funzioni in C 1 Funzioni in C 2 3 4 5 6 7

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

o 1: passaggio di array ad una funzione Un array (identificato dall indirizzo 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,...);