void p(int x) { float y = x * sin(0.75); printf( %f, y); }

Documenti analoghi
dare un nome a una istruzione non denota un valore, quindi non c è tipo di ritorno void

Una procedura permette di" void p(int x) { x = x * 2; printf( %d, x); }

Una procedura permette di#! dare un nome a una istruzione#! rendendola parametrica!! non denota un valore, quindi " non c#è tipo di ritorno!

Procedure. Una procedura permette di dare un nome a una istruzione rendendola parametrica non denota un valore, quindi non c è tipo di ritorno void

FUNZIONI... E PROCEDURE

Funzioni in C. Architetture multi-componente

ESEMPIO PROCEDURE. return IN UNA PROCEDURA. Disegnare, per un dato n, la seguente figura * *** ***** ******* ********* ***********

PROCEDURE. Una procedura permette di. void p(int x) { x = x * 2; printf( %d, x); }

PROCEDURE. Una procedura permette di. void p(int x) { x = x * 2; printf( %d, x); }

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

FUNZIONI. Esempi (pseudo-c): dare un nome a una espressione rendere tale espressione parametrica. float f(){ * sin(0.75); } float f1(int x) {

FUNZIONI. Esempi (pseudo-c): dare un nome a una espressione rendere tale espressione parametrica. float f(){ * sin(0.75); } float f1(int x) {

Una funzione riceve dati di ingresso in corrispondenza ai parametri

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

FUNZIONI FUNZIONI COME COMPONENTI SW

FUNZIONI FUNZIONI COME COMPONENTI SW

Esempi (pseudo-c):! float f(){ * sin(0.75); } float f1(int x) { 2 + x * sin(0.75); } Esempio

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Tempo di vita e scope delle variabili

Il linguaggio C Passaggio dei parametri

FUNZIONI: IL MODELLO A RUN-TIME!

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Linguaggio C: Breve riepilogo sulle funzioni. Fondamenti di Informatica T

FUNZIONI: IL MODELLO A RUN-TIME

Il linguaggio C Funzioni e procedure

parametri attuali ricopiati parametri formali

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Il linguaggio C funzioni e puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

FUNZIONI: IL MODELLO A RUN-TIME

Corso di Informatica A.A

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

per costruire specifici componenti software

Informatica (A-K) 12. Linguaggio C -3

C funzioni à scope di variabili

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Le funzioni: la dichiarazione

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Funzioni in C. Informatica Generale - Funzioni in C Versione 1.0, aa p.1/25

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Funzioni e Procedure. Marco D. Santambrogio Ver. aggiornata al 11 Marzo 2014

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Le funzioni. La Forma Generale di Funzione

Le funzioni. La Forma Generale di Funzione

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

Strategie di programmazione

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

L assegnamento. Andrea Marin. a.a. 2011/2012. Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

Linguaggio C: PUNTATORI

Ottenere una modifica del parametro attuale

Passaggio dei parametri. Passaggio dei parametri

Prof. G. Ascia. Le funzioni. Fondamenti di Informatica

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Passaggio dei parametri

Il linguaggio C. Puntatori e dintorni

Procedure e funzioni A. Ferrari

Allocazione dinamica della memoria

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

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

Linguaggio C: le funzioni. Introduzione e sintassi

Funzioni come parametri

Corso di Informatica A.A

Perché il linguaggio C?

Verso i puntatori: Cosa è una variabile?

Introduzione al linguaggio C Funzioni

Funzioni in C. Fondamenti di Informatica. Daniele Loiacono

Introduzione ai puntatori in C Definizione

Puntatori (in C) Emilio Di Giacomo

Programmazione Procedurale in Linguaggio C++

Oggi e domani. Riusabilità

int main(){ int numero; /* numero di cui voglio calcolare il fattoriale */ int fatt; /* memorizzo il fattoriale di numero */ int somma=0;

Record di Attivazione

Costanti e Variabili

Corso sul linguaggio Java

Funzioni, Stack e Visibilità delle Variabili in C

Perché il linguaggio C?

C: primi elementi. Lezione 4

Fondamenti di Informatica

Fondamenti di Informatica II 3. Funzioni in C++ (parte 1)

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Definizione di classi. Walter Didimo

Fondamenti di Informatica

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Variabili. Programma principale: funzione main. Funzioni

Corso di Laboratorio di Sistemi Operativi A.A

Esercizi. La funzione swapint() primo tentativo

Fondamenti di Informatica T. Linguaggio C: le Funzioni

Introduzione al linguaggio C Puntatori

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW

Transcript:

FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return 2 + 3 * sin(0.75); } float f1(int x) { return 2 + x * sin(0.75); } E PROCEDURE Una procedura permette di dare un nome a una istruzione rendendola parametrica non denota un valore, quindi non c è tipo di ritorno void void p(int x) { float y = x * sin(0.75); printf( %f, y); }

PROCEDURE COME COMPONENTI SOFTWARE Una procedura è un componente software che cattura l idea di macro-istruzione molti possibili parametri, che possono anche essere e modificati mentre e nelle e funzioni non devono essere modificati nessun valore di uscita esplicito PROCEDURE COME SERVITORI Come una funzione,una procedura è un servitore passivo che serve un cliente per volta che può trasformarsi in cliente invocando se stessa o altre procedure In C, una procedura ha la stessa struttura di una funzione, salvo il tipo di ritorno che è void

RITORNO DA UNA PROCEDURA L istruzione return provoca solo la restituzione del controllo al cliente non è seguita da una espressione da restituire quindi, non è necessaria se la procedura termina spontaneamente a fine blocco (cioè al raggiungimento della parentesi graffa di chiusura) COMUNICAZIONE CLIENTE SERVITORE Nel caso di una procedura, non esistendo valore di ritorno, cliente e servitore comunicano solo: mediante i parametri mediante aree dati globali Il passaggio per valore non basta più: occorre il passaggio per riferimento per poter fare cambiamenti permanenti ai dati del cliente.

PASSAGGIO DEI PARAMETRI In generale, un parametro può essere trasferito dal cliente al servitore: per valore o copia (by value) si trasferisce il valore del parametro attuale per riferimento (by reference) si trasferisce un riferimento al parametro attuale ESEMPIO Perché il passaggio per valore non basta? Problema: scrivere una procedura che scambi i valori di due variabili intere. 1 Specifica: Dette A e B le due variabili, ci si può appoggiare a una variabile ausiliaria T, e fare una triangolazione in tre fasi. 10 B 7 T 10 3 A 7 T 10 B 7 2 10 B 7 T 10 A A

ESEMPIO Supponendo di utilizzare, senza preoccuparsi, il passaggio per valore usato finora, la codifica potrebbe essere espressa come segue: void scambia(int a, int b) { int t; t = a; a = b; b = t; return; /* può essere omessa */ } ESEMPIO Il cliente invocherebbe quindi la procedura così: int main(){ int y = 5, x = 33; scambia(x, y); /* ora dovrebbe essere x=5, y=33... MA NON E VERO!! */ return 0;} Perché non funziona??

ESEMPIO La procedura ha effettivamente scambiato i valori di A e B al suo interno ma questa modifica non si è propagata al cliente, perché sono state scambiate le copie locali alla procedura, non gli originali! al termine della procedura, le sue variabili locali sono state distrutte nulla è rimasto del lavoro fatto dalla procedura!! X 33 Y 5 A 5 B 33 PASSAGGIO PER VALORE Ogni azione fatta su a e b è strettamente locale al servitore. Quindi a e b vengono scambiati ma quando il servitore termina, tutto scompare. x 33 copia 33 y 5 5 b a valori (copiati) di x e y cliente servitore

PASSAGGIO PER VALORE... e nel cliente non è cambiato niente!!! x 33 y 5 cliente PASSAGGIO DEI PARAMETRI IN C Il C adotta sempre il passaggio per valore è sicuro: le variabili del cliente e del servitore sono disaccoppiate ma non consente di scrivere componenti software il cui scopo sia diverso dal calcolo di una espressione per superare questo limite occorre il passaggio per riferimento (by reference)

PASSAGGIO PER RIFERIMENTO Il passaggio per riferimento (by reference) non trasferisce una copia del valore del parametro attuale ma un riferimento al parametro, in modo da dare al servitore accesso diretto al parametro in possesso del cliente il servitore, quindi, accede direttamente al dato del cliente e può modificarlo. PASSAGGIO PER RIFERIMENTO Si trasferisce un riferimento ai parametri attuali (cioè i loro indirizzi) x 33 y 5 cliente

PASSAGGIO PER RIFERIMENTO Ogni azione fatta su a e b in realtà è fatta su x e y nell environment del cliente x α 33 riferimento α a y 5 β riferimento β b riferimenti a x e y (indirizzi) cliente servitore PASSAGGIO PER RIFERIMENTO Quindi, scambiando a e b in realtà si scambiano x e y x α 33 riferimento α a y 5 β riferimento β b riferimenti a x e y (indirizzi) cliente servitore

PASSAGGIO PER RIFERIMENTO... e alla fine la modifica permane! x 5 y 33 cliente REALIZZARE IL PASSAGGIO PER RIFERIMENTO IN C Il C non fornisce direttamente un modo per attivare il passaggio per riferimento, che pero e praticamente indispensabile quindi, dobbiamo costruircelo. È possibile costruirlo? Come? Poiché passare un parametro per riferimento comporta la capacità di manipolare indirizzi di variabili gestire il passaggio per riferimento implica la capacità di accedere, direttamente o indirettamente, agli indirizzi delle variabili.

REALIZZARE IL PASSAGGIO PER RIFERIMENTO IN C In particolare occorre essere capaci di: ricavare l indirizzo di una variabile dereferenziare un indirizzo di variabile, ossia recuperare la variabile dato il suo indirizzo. Nei linguaggi che offrono direttamente il passaggio per riferimento, questi passi sono effettuati in modo trasparente all utente l utente non manipola alcun dettaglio della macchina fisica sottostante In C l utente deve conoscere gli indirizzi delle variabili e quindi accedere alla macchina sottostante. INDIRIZZAMENTO E DEREFERENCING Il C offre a tale scopo due operatori, che consentono di: ricavare l indirizzo di una variabile operatore estrazione di indirizzo dereferenziare un indirizzo di variabile operatore di dereferenziamento * &

INDIRIZZAMENTO E DEREFERENCING Se x è il nome di una variabile, &x denota l indirizzo in memoria di tale variabile: &x α Se α è l indirizzo di una variabile, *α denota tale variabile: x *α INDIRIZZAMENTO E DEREFERENCING &x α x *α Livello di astrazione del linguaggio di alto livello x α Livello di astrazione della macchina fisica sottostante

PUNTATORI Un puntatore è il costrutto linguistico introdotto dal C (e da molti altri linguaggi) come forma di accesso alla macchina sottostante e in particolare agli indirizzi di variabili Un tipo puntatore a T è un tipo che denota l indirizzo di memoria di una variabile di tipo T. Un puntatore a T è una variabile di tipo puntatore a T che può contenere l indirizzo di una variabile di tipo T. Definizione di una variabile puntatore: <tipo> * <nomevariabile> ; Esempi: int *p; int* p; int * p; PUNTATORI Queste tre forme sono equivalenti, e definiscono p come puntatore a intero

REALIZZARE IL PASSAGGIO PER RIFERIMENTO IN C In C per realizzare il passaggio per riferimento: il cliente deve passare esplicitamente gli indirizzi il servitore deve prevedere esplicitamente dei puntatori come parametri formali REALIZZARE IL PASSAGGIO PER RIFERIMENTO IN C void scambia(int* a, int* b) { int t; t = *a; *a = *b; *b = t; } int main(){ int y = 5, x = 33; scambia(&x, &y); return 0;}

OSSERVAZIONE Quando un puntatore è usato per realizzare il passaggio per riferimento, la funzione non dovrebbe mai alterare il valore del puntatore. Quindi, se a e b sono due puntatori: *a = *b SI a = b NO In generale una funzione può modificare un puntatore, ma non è opportuno che lo faccia se esso realizza un passaggio per riferimento PUNTATORI Un puntatore è una variabile destinata a contenere l indirizzo di un altra variabile Vincolo di tipo: un puntatore a T può contenere solo l indirizzo di variabili di tipo T. Esempio: int x = 8; int* p; p = &x; x p α 8 Da questo momento, *p e x sono due modi alternativi per denotare la stessa variabile α

COMUNICAZIONE TRAMITE L ENVIRONMENT GLOBALE Una procedura può anche comunicare con il suo cliente mediante aree dati globali: un esempio sono le variabili globali del C. Le variabili globali in C: sono allocate nell area dati globale (fuori da ogni funzione) esistono già prima della chiamata del main sono inizializzate automaticamente a 0 salvo diversa indicazione possono essere nascoste in una funzione da una variabile locale omonima sono visibili, previa dichiarazione extern, in tutti i file dell applicazione ESEMPIO Esempio: Divisione intera x/y con calcolo di quoziente e resto. Occorre calcolare due valori che supponiamo di mettere in due variabili globali. int quoziente, int resto; void dividi(int x, int y) { resto = x % y; quoziente = x/y; } int main(){ dividi(33, 6); printf( %d%d, quoziente,resto); return 0;} variabili globali quoziente e resto visibili in tutti i blocchi Il risultato è disponibile per il cliente nelle variabili globali quoziente e resto

ESEMPIO Esempio: Con il passaggio dei parametri per indirizzo avremmo il seguente codice void dividi(int x, int y, int* quoziente, int* resto) { *resto = x % y; *quoziente = x/y; } int main(){ int k = 33, h = 6, quoz, rest; int *pq = &quoz, *pr = &rest; dividi(33, 6, pq, pr); printf( %d%d, quoz,rest); return 0;}