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.

Slides:



Advertisements
Presentazioni simili
C C++ &.
Advertisements

Puntatori Linguaggio C.
Funzioni In C++ le funzioni sono caratterizzate da un nome, dal tipo della variabile ritornata e da una lista di parametri (opzionali) La lista dei parametri.
Funzioni e procedure Ogni linguaggio di programmazione ad alto livello mette a disposizione del programmatore questi strumenti, ed il C non è da meno!
Sottoprogrammi: funzioni e procedure
IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.
Procedure e funzioni A. Ferrari.
Procedure e funzioni In linguaggio C.
LS Tron Classe 4TC – as 2006/07 LORGANIZZAZIONE DEI PROGRAMMI UD. 8 p. 282.
PUNTATORI Introduzione
Type Checking (1° parte)
Introduzione al linguaggio C
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Funzioni definite dall’utente
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Allocazione dinamica della memoria
1 Corso di Informatica (Programmazione) Lezione 12 (19 novembre 2008) Programmazione in Java: i metodi statici.
1. 2 ALCUNE INFORMAZIONI PRELIMINARI Docente: E. Burattini Libri di testo: Deitel H.M., Deitel P.J. – C++ Fondamenti di programmazione,
memoria gestita staticamente:
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Le funzioni.
Espressioni condizionali
Le funzioni a tempo di esecuzione
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
AN FI Array Array in Java. AN FI Array Dichiarazione di array in Java [ ]; //oppure u [] ; int a[]; int[] a; u La dimensione non è specificata.
AN Fondam98 Puntatori Azioni e procedure Assegnamenti, indirizzi e puntatori.
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo.
AN FI Un denominatoe comune Linguaggi di programmazione Un denominatore comune.
AN FI Un denominatoe comune Lo stile funzionale Concetti fondamentali.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Un esempio: Calcolo della potenza n-esima di un numero reale
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
Lo sviluppo top down Le funzioni
Passaggio di parametri per indirizzo
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
I metodi F. Bombi Campi e metodi Abbiamo visto che una classe può contenere – Campi – Metodi stato I campi sono utilizzati per memorizzare.
Complessità di un algoritmo
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
CORSO DI PROGRAMMAZIONE II Lezione 22
- prof. V. Riboldi - SOTTOPROGRAMMI IN TPASCAL METODO TOP DOWN.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 3 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Sottoprogrammi e funzioni
Procedure e funzioni In linguaggio C.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Lo stato  I domini della semantica restano invariati: Ide, Val (Int  { ,  }) Loc (locazioni di memoria), FunctDecl. ma definiamo 2 funzioni: Loc :
FUNZIONI: IL MODELLO A RUN-TIME 1) creazione di una nuova attivazione (istanza) del servitore 2) allocazione di memoria per i parametri e per le variabili.
FUNZIONI... Una funzione permette di  dare un nome a una espressione  rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) {
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2016.
Introduzione alle Classi e agli Oggetti in Java 1.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Transcript della presentazione:

FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * 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) { y = x * sin(0.75); }

PROCEDURE come COMPONENTI SW Una procedura è un componente software che cattura lidea di macro-istruzione molti possibili parametri, che possono anche essere modificati nessun valore di uscita esplicito

PROCEDURE come SERVITORI Come già una funzione, una procedura è un servitore passivo che serve un cliente per volta che può trasformarsi in cliente invocando se stessa In C, una procedura ha la stessa struttura di una funzione, salvo il tipo di ritorno che è void

RITORNO DA PROCEDURA Listruzione return provoca solo la restituzione del controllo al cliente non è seguita da una espressione da restituire quindi, non è necessaria se la proce- dura 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 comu- nicano solo: mediante i parametri mediante aree dati globali Il passaggio per valore non basta più: occorre il passaggio per riferimento per poter fare cambiamenti perma- nenti ai dati del cliente.

PASSAGGIO DEI PARAMETRI In generale, un parametro può essere trasferito: 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. A T B Specifica: Dette A e B le due variabili, ci si può appoggiare a una variabile ausiliaria T, e fare una triangolazione in tre fasi.

ESEMPIO Supponendo di utilizzare, senza preoccuparsi, il passaggio per valore usato finora, la codifica potrebbe essere espressa come segue: A T B 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ì: A T B main(){ int y = 5, x = 33; scambia(x, y); /* ora dovrebbe essere x=5, y=33... MA NON E VERO !! */ } Perché non funziona??

5 33 a b t

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 co- pie locali alla procedura, non gli originali! al termine della procedura, le sue variabili locali sono state distrutte nulla è rimasto del lavoro fatto dalla procedura!!

PASSAGGIO PER VALORE clienteservitore x 33 copia a 33 valori (copiati) di x e y Ogni azione fatta su a e b è strettamente locale al servitore y 5 b 5

PASSAGGIO PER VALORE clienteservitore x 33 copia a 5 valori (copiati) di x e y Quindi, a e b possono sì essere scambiati... y 5 b 33 … ma quando il servitore termina, tutto scompare!

PASSAGGIO PER VALORE cliente x e qui non è cambiato niente!!! y 5

PASSAGGIO DEI PARAMETRI IN C Il C adotta sempre il passaggio per valore è sicuro: le variabili del chiamante e del chiamato 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 DEI PARAMETRI IN C Il C non supporta direttamente il passaggio per riferimento è una grave mancanza lo fornisce indirettamente solo per alcuni tipi di dati (array) quando serve occorre quindi costruirselo. Il C++ e Java invece lo forniscono.

PASSAGGIO PER RIFERIMENTO Si trasferisce un riferimento ai parametri attuali (cioè i loro indirizzi) cliente x 33 y 5

PASSAGGIO PER RIFERIMENTO clienteservitore riferimento a riferimenti a x e y (indirizzi) x 33 y 5 b riferimento Ogni azione fatta su a e b in realtà è fatta su x e y nellenvironment del cliente

PASSAGGIO PER RIFERIMENTO clienteservitore riferimento a riferimenti a x e y (indirizzi) x 33 y 5 b riferimento Quindi, scambiando a e b...

PASSAGGIO PER RIFERIMENTO clienteservitore riferimento a riferimenti a x e y (indirizzi) x 5 y 3 b riferimento … in realtà si scambiano x e y !

PASSAGGIO PER RIFERIMENTO cliente x 5... e alla fine la modifica permane! y 33

PASSAGGIO PER RIFERIMENTO IN C++ In C++, il passaggio per riferimento si attiva cambiando leggermente la sintassi della dichiarazioni dei parametri nel servitore. Non più: ma bensì: & Il cliente, invece, non cambia.

LESEMPIO RIFORMULATO Quindi: void scambia( int& a, int& b ) { int t; t = a; a = b; b = t; } main(){ int y = 5, x = 33; scambia(x, y); /* ora funziona! */ } Nota: un file sorgente C++ deve avere estensione.cpp

ESEMPIO - RECORD DI ATTIVAZIONE Caso del passaggio per valore:

ESEMPIO - RECORD DI ATTIVAZIONE Caso del passaggio per riferimento (C++):

REALIZZARE IL PASSAGGIO PER RIFERIMENTO IN C Il C non fornisce direttamente un modo per attivare il passaggio per riferimento, come fa invece il C++ Però, il passaggio per riferimento è praticamente indispensabile quindi, dobbiamo costruircelo. È possibile costruirlo? E se sì, come?

REALIZZARE IL PASSAGGIO PER RIFERIMENTO IN C Poiché passare un parametro per riferimento comporta la capacità di inserire nei record di attivazione indirizzi di variabili… … gestire il passaggio per riferimento im- plica la capacità di accedere, direttamente o indirettamente, agli indirizzi delle varia- bili.

REALIZZARE IL PASSAGGIO PER RIFERIMENTO IN C In particolare occorre essere capaci di: ricavare lindirizzo di una variabile dereferenziare un indirizzo di variabile, ossia recuperare la variabile dato il suo indirizzo.

INDIRIZZO E DEREFERENCING Il C offre a tale scopo due operatori, che consentono di: ricavare lindirizzo di una variabile operatore estrazione di indirizzo & dereferenziare un indirizzo di variabile operatore di dereferenziamento *

INDIRIZZO E DEREFERENCING Se x è una variabile, &x denota ll-value: Se è lindirizzo di una variabile, * denota lr-value:

PUNTATORI Un puntatore è il costrutto linguistico introdotto dal C (e da molti altri linguaggi) come forma di accesso alla macchina sottostante. Un tipo puntatore a T è un tipo che denota lindirizzo di memoria di una variabile di tipo T. Un PUNTATORE a T è una variabile ditipo puntatore a T che può contenere lindirizzo di una variabile di tipo T.

PUNTATORI Definizione di una variabile puntatore: * ; Esempi: int *p ; Queste tre forme sono equivalenti, e definiscono p come puntatore a intero

RICOSTRUIRE IL PASSAGGIO PER RIFERIMENTO IN C In C++ il cliente non deve fare esplicita-mente nulla: è il servitore che specifica che i parametri devono passare per riferimento. Volendo ricostruire tutto ciò in C: –il cliente deve passare esplicitamente gli indirizzi –il servitore deve prevedere esplicitamente dei puntatori come parametri formali

IL SOLITO ESEMPIO void scambia( int* a, int* b ) { int t; t = *a ; *a = *b ; *b = t; } main(){ int y = 5, x = 33; scambia( &x, &y ); } Il cliente deve ricavare esplicitamente gli indirizzi di x e y, per passarli.

a b t 5 33 x y 33

IL SOLITO ESEMPIO void scambia( int* a, int* b ) { int t; t = *a ; *a = *b ; *b = t; } main(){ int y = 5, x = 33; scambia( &x, &y ); } Il servitore deve prevedere esplicitamente dei puntatori Cambia, da entrambi i lati, il contratto di comunicazione.

OSSERVAZIONE Quando un puntatore è usato per realiz- zare 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

OSSERVAZIONE Quando un puntatore è usato per realiz- zare il passaggio per riferimento, la funzione non dovrebbe mai alterare il valore del puntatore. NOTA: questo non significa che in generale una fun- zione non debba o possa modificare un puntatore: semplicemente, non è opportuno che lo faccia se esso realizza un passaggio per riferimento

IL SOLITO ESEMPIO void scambia( int* a, int* b ) { int t; t = *a ; *a = *b ; *b = t; } main(){ int y [] ={ 2,3 }; scambia( y[0], y[1] ); } Il cliente deve ricavare esplicitamente gli indirizzi di x e y, per passarli.

IL SOLITO ESEMPIO void scambia( int y[], int n ) { int t; t = y[n] ; y[n] =y[n-1]; y[n-1] = t; } main(){ int y[] ={ 2,3 }; scambia( y, 1 ); } Il cliente deve ricavare esplicitamente gli indirizzi di x e y, per passarli.