Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Documenti analoghi
Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Esercizi C su array e matrici

Linguaggio C: le funzioni. Introduzione e sintassi

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggio C: introduzione

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Algoritmi e basi del C Struttura di un programma

Tempo di vita e scope delle variabili

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

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

Programmazione (imperativa)

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

IL PRIMO PROGRAMMA IN C

INFORMATICA 1 L. Mezzalira

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Il linguaggio C. Notate che...

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

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercitazione 4. Comandi iterativi for, while, do-while

Array e puntatori in C

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Le funzioni, e le istruzioni di input/output

Linguaggio Macchina. Linguaggio Macchina. Linguaggio Macchina. Linguaggio Macchina ADD A,B ISTRUZIONE SUCCESSIVA

Struttura dei programmi C

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

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

Dove vengono definiti? il concetto di sottoprogramma

Caratteri e stringhe

ACSO Programmazione di Sistema e Concorrente

PASCAL standard. Il linguaggio PASCAL nasce come evoluzione del linguaggio ALGOL60 (ALGOrithmic Language) nel 1968 ad opera di N. Wirth.

Architettura dei calcolatori e sistemi operativi. Sottoprogrammi e MIPS. Espressioni algebriche. Capitolo 2 P&H

I puntatori (richiamo)

Consideriamo un vettore allocato dinamicamente

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:

Struttura interna del sistema operativo Linux

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

L Allocazione Dinamica della Memoria

Parte 2. Ricorsione. [M.C.Escher Drawing hands, 1948] - AA. 2012/13 2.1

La gestione dei caratteri in C

Carlo Ghezzi, Gian Pietro Picco

Il C nel C++: Funzioni

Cenni sul preprocessore e il suo utilizzo

FONDAMENTI di INFORMATICA L. Mezzalira

Puntatori. Fondamenti di Programmazione

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Gestione di files Motivazioni

Lezione 6 Selection/Insertion Sort su interi e stringhe

Programmazione I - Laboratorio

Esercitazioni di Informatica 3

Puntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Definizione di metodi

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

Corso di Fondamenti di Informatica Tipi strutturati: Strutture typedef Anno Accademico 2008/2009 Francesco Tortorella

Allocazione Dinamica della Memoria

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Strutture Dinamiche. Fondamenti di Informatica

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Introduzione alla Programmazione in Java attraverso un esempio commentato

Esercitazione 6. Array

Strutture dati e loro organizzazione. Gabriella Trucco

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2009/2010

Programmazione a moduli in C

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Stringhe e allocazione dinamica della memoria

Gestione della Memoria

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

Istituto Tecnico Industriale M. M. Milano Polistena. Classe III D a.s. 2015/2016 C++ Guida Base

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

Array multidimensionali e stringhe

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Programmazione in Java (I modulo)

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

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

Definizione di metodi in Java

Introduzione al linguaggio C

int f(char *s, short n, float x) {... } /* definizione di f */ int f(char *, short, float); /* prototipo di f */

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

Linguaggio C: i file

Mini-dispensa sui puntatori in C

Elementi di C++ di base

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Gli Operatori. Linguaggio C. Gli Operatori. Esempi sull uso dell Operatore di Assegnamento. L Operatore di Assegnamento

Esempio di Prova Scritta

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Linguaggio C I puntatori

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

La programmazione nel linguaggio C

Funzioni. Corso di Fondamenti di Informatica

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. Il linguaggio C II

Transcript:

Scope delle variabili e passaggio parametri Danilo Ardagna Politecnico di Milano 1-4-2014

Introduzione! Con le funzioni è stato introdotto un meccanismo per definire dei piccoli programmi all interno di altri programmi! Questi piccoli programmi sono autonomi con il resto del codice! Al loro interno sono definite le proprie variabili ed il canale di comunicazione con il codice chiamante (passaggio paramentri, return)! A supporto di questo meccanismo deve esistere una gestione degli identificatori delle variabili! È infatti possibile avere due variabili con lo stesso nome a patto che abbiano raggio di visibilità disgiunto 2

Visibilità! Visibilità di un identificatore: indicazione della parte del programma in cui tale identificatore può essere usato! Ambiente globale del programma! Insieme di identificatori (tipi, costanti, variabili) definiti nella parte dichiarativa globale! Regole di visibilità: visibili a tutte le funzioni del programma! Ambiente locale di una funzione! Insieme di identificatori definiti nella parte dichiarativa locale e degli identificatori definiti nella testata (parametri formali)! Regole di visibilità: visibili alla funzione e ai blocchi in essa contenuti! Ambiente di blocco! Insieme di identificatori definiti nella parte dichiarativa locale del blocco! Regole di visibilità: visibili al blocco e ai blocchi in esso contenuti 3

Esempi int x; f() { int y; y=1; int x; g(int y, char z) { int k; int l; La visibilità di y si estende dal punto di dichiarazione fino alla fine del blocco di appartenenza y e z locali alla funzione g,con visibilità nel blocco racchiuso da parentesi graffe k e l hanno la stessa visibilità f(int x) { char x; Errata! Si tenta di definire due volte la variabile locale x nello stesso blocco 4

Mascheramento (shadowing)! Un nome ridefinito all interno di un blocco nasconde il significato precedente di quel nome! Tale significato è ripristinato all uscita del blocco più interno int x; int f() { int x; x=1; { int x; x=2; x=3; Leggi(x); /*nome globale*/ /*x locale che nasconde x globale*/ /*assegna 1 al primo x locale*/ /* nasconde il primo x locale*/ /*assegna 2 al secondo x locale*/ /*assegna 3 al primo x locale*/ /*inserisce un dato in x globale*/! In caso di omonimia di identificatori in ambienti diversi è visibile quello dell ambiente più vicino 5

Visibilità char g1, g2, g3; main() { int a, b; {/*blocco1*/ double a,c void f1(){ {/*blocco2*/ char a,d; {/*blocco3*/ float d g1,g2,g3 a,b a,c a,d d Livello globale main blocco1 blocco2 blocco3 f1 6

Ambiente di esecuzione! L ambiente di esecuzione di una funzione (variabili e parametri formali) viene creato al momento della chiamata e rilasciato quando la funzione termina! In una sequenza di chiamate, l ultima chiamata è la prima a terminare! La zona di memoria di lavoro che contiene l ambiente di esecuzione di un sottoprogramma è gestito con la logica di una pila (stack)! L ultimo elemento inserito nello stack è il primo ad essere estratto! Logica LIFO (Last In First Out) 7

Ambiente di esecuzione: esempio #include <stdio.h> void a (); void b(); void c(); main(){ a(); void a (){ printf( Esecuzione di a\n ); b(); printf( Termine di a\n ); void b(){ printf( Esecuzione di b\n ); c(); printf( Termine di b\n ); void c(){ printf( Esecuzione di c\n ); printf( Termine di c\n ); 8

Ambiente di esecuzione: esempio Esecuzione di a Esecuzione di b Esecuzione di c Termine di c Termine di b Termine di a Ambiente c Ambiente b Ambiente a 9

Record di attivazione! Alla chiamata di una funzione! Si alloca uno spazio di memoria (record di attivazione) in cima allo stack per contenere l ambiente locale della funzione! Lo spazio viene rilasciato quando la funzione termina! Il record di attivazione contiene:! L ambiente locale della funzione (parametri formali e le variabili locali)! L indirizzo di ritorno al chiamante 10

Funzionamento del record di attivazione! Ad ogni attivazione viene allocato un record di attivazione! Al termine dell attivazione il record viene rilasciato (l area di memoria è riutilizzabile)! La dimensione del record di attivazione è già nota in fase di compilazione! Il numero di attivazioni della funzione non è noto! Il primo record di attivazione è destinato al main() 11

Lo stack! Nello stack, i record vengono allocati uno sopra l altro ; il primo record dello stack è relativo all ultima funzione attivata e non ancora terminata! Lo stack cresce dal basso verso l alto! Stack pointer: registro della CPU che contiene l indirizzo della cima della pila! Una parte della RAM è destinata a contenere lo stack! Stack overflow: quando l area della RAM destinata allo stack viene superata (troppi annidamenti di chiamate) 12

Lo stack SP 312 Operazione di inserimento: -incremento SP -scrittura nella parola indirizzata da SP Operazione di estrazione: -lettura dalla parola indirizzata da SP -decremento SP 312 311 310... 303 13

Esempio Main P1 P2 Chiama P1... etc. Act. Record P2(2) Act. Record P1(2) Act. Record P2(1) Act. Record P1(1) Act. Record Main Variabili globali 14

Ricerca in array ordinati int ricercaarray(int v[], int elemento, int n) { int i; int trovato; for (i=0,trovato=0;i<n &&!trovato&& v[i]<=elemento;){ if (v[i]==elemento) trovato=1; else i++; if (trovato) return i; else return -1; 15

Ricerca in array ordinati int ricercabinaria(int v[], int elemento, int n) { int i; int end=n-1;int start=0; while(end >= start) { i= (start + end)/2; if(elemento == v[i]) return i; if (elemento < v[i]) end=(i-1); else start=(i+1); return -1; 16

Esercizi! Scrivere un programma che, utilizzando opportune procedure (o funzioni, si scelga la forma più adatta) esegua le seguenti operazioni: 1. Legga da tastiera una matrice m di interi, di R righe e C colonne (R e C costanti) 2. Verifichi se, in ciascuna riga della matrice, c e almeno un valore pari 3. Stampi a video il risultato del controllo descritto al punto 2 17

Esercizi! Scrivere un programma che, utilizzando opportune procedure (o funzioni, si scelga la forma più adatta) esegua le seguenti operazioni: 1. Legga da tastiera un array a di N interi 2. Stampi a video il numero di valori pari presenti nell array 3. Cambi tutti i valori dispari presenti nell array con uno zero 4. Stampi a video il nuovo array 18

Funzioni: Scambio di informazioni! Il chiamante deve poter fornire i valori attuali (specifici) sui quali eseguire le operazioni definite nel sottoprogramma! Il chiamato deve poter fornire al chiamante i risultati dell elaborazione! Lo scambio di informazioni tra chiamante e chiamato può avvenire:! Valore restituito da una funzione (dal chiamato al chiamante)! Vale solo per le funzioni! Per fornire un valore al chiamante! Passaggio dei parametri (in entrambe le direzioni)! Per fornire i valori in ingresso al chiamato! Per fornire i risultati di operazioni al chiamante! Variabili globali (in entrambe le direzioni)! Fortemente sconsigliato 19

Passaggio dei parametri! Il passaggio dei parametri consiste nell associare, all atto della chiamata di un sottoprogramma, ai parametri formali i parametri attuali! Se il prototipo di una funzione è float circonferenza (float raggio);! Eseguiamo la funzione con l istruzione c = circonferenza(5.0);! In questo modo la variabile raggio (il parametro formale) assumerà per quella particolare invocazione il valore 5 (il parametro attuale)! Lo scambio di informazioni con passaggio dei parametri tra chiamante e chiamato può avvenire in due modi:! Passaggio per valore! Passaggio per indirizzo 20

Passaggio per valore! All atto della chiamata il valore del parametro attuale viene copiato nelle celle di memoria del corrispondente parametro formale. In altre parole il parametro formale e il parametro attuale si riferiscono a due diverse celle di memoria! Il sottoprogramma in esecuzione lavora nel suo ambiente e quindi sui parametri formali! I parametri attuali non vengono modificati! Meccanismo per fornire informazioni a sola lettura alle funzione 21

Esempio: passaggio per valore float circonferenza(float raggio) { float circ; circ = raggio * 6.28; raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; /* nel main */ float c,r=5; c=circonferenza(r); /*Attenzione! r vale sempre 5 */ Ambiente della funzione circonferenza raggio Quando invoco la funzione in raggio viene copiato il valore di r r 5 5 circ Ambiente della funzione main c 22

Esempio: passaggio per valore float circonferenza(float raggio) { float circ; circ = raggio * 6.28; raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; /* nel main */ float c,r=5; c=circonferenza(r); /*Attenzione! r vale sempre 5 */ Ambiente della funzione circonferenza raggio Quando invoco la funzione in raggio viene copiato il valore di r r 5 57 circ 31.4 Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main Ambiente della funzione main c 31.4 23

Esempio: passaggio per valore float circonferenza(float raggio) { float circ; circ = raggio * 6.28; raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; /* nel main */ float c,r=5; c=circonferenza(r); /*Attenzione! r vale sempre 5 */ r 5 c 31.4 Ambiente della funzione main 24

Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; Nel main: swap(a,b) a 3 b 7 25

Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; Nel main: swap(a,b) a 3 b 7 p 3 q 7 temp 3 26

Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; Nel main: swap(a,b) a 3 b 7 p 7 q 7 temp 3 27

Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; Nel main: swap(a,b) a 3 b 7 p 7 q 3 temp 3 28

Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; Nel main: swap(a,b) Al termine dell esecuzione di swap le variabili nel main restano inalterate! a 3 b 7 p 7 q 3 temp 3 29

Passaggio per indirizzo! All atto della chiamata l indirizzo dei parametri attuali viene associato ai parametri formali. In altre parole il parametro attuale e il parametro formale si riferiscono alla stessa cella di memoria! Il sottoprogramma in esecuzione lavora nel suo ambiente sui parametri formali (e di conseguenza anche sui parametri attuali) e ogni modifica sul parametro formale è una modifica del corrispondente parametro attuale! Gli effetti del sottoprogramma si manifestano nel chiamante con modifiche al suo ambiente locale di esecuzione! Meccanismo per implementare uno scambio di informazioni bidirezionale con le funzioni 30

Passaggio per indirizzo in C! Richiede l uso dei puntatori. Aspetti che non vedremo in questo corso! Ci limiteremo a dire che:! I parametri il cui tipo è un tipo base o struct vengono passati per valore! I parametri il cui tipo è array sono sempre passati per indirizzo e pertanto se una funzione modifica un parametro formale ti tipo array allora le modifiche saranno visibili anche esternamente 31

1 2 4 #include <stdio.h> 5 #define SIZE 10 6 void bubblesort( int array[], int size); 7 8 void main() 9 { 10 11 int a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 ; 12 int i; 13 14 printf( "Data items in original order\n" ); 15 16 for ( i = 0; i < SIZE; i++ ) 17 printf( "%4d", a[ i ] ); 18 19 bubblesort( a, SIZE ); /* ordina */ 20 printf( "\ndata items in ascending order\n" ); 21 22 for ( i = 0; i < SIZE; i++ ) 23 printf( "%4d", a[ i ] ); 24 25 printf( "\n" ); 26 27 28 29 Data items in original order 2 6 4 8 10 12 89 68 45 37 Data items in ascending order 2 4 6 8 10 12 37 45 68 89

30 void bubblesort( int array[], int size ) 31 { 32 33 int i, j, swap; 34 for ( i= 0; i< size - 1; i++ ) 35 36 for ( j = 1; j < size; j++ ) 37 38 if ( array[ j ] < array[ j - 1 ] ){ 39 swap = array[j-1]; 40 array[j-1]=array[j]; 41 array[j]=swap; 40 42 43 http://www.youtube.com/watch?feature=endscreen&nr=1&v=mtcrehrt_k0 http://www.youtube.com/watch?v=p00xjgwzz2c http://en.wikipedia.org/wiki/file:bubble_sort_animation.gif

Commento! Esistono moltissimi algoritmi di ordinamento! Quello visto si chiama bubblesort! Differiscono per l'efficienza (tempo di esecuzione)! Sono ampiamente studiati come esempio per l'analisi degli algoritmi 34

Altri algoritmi! Shaker sort: come il bubble sort ma anzichè ripartire dall inizio per fare i confronti si alternano il verso di scans scansione dell array ripartendo dal fondo (come in un ascensore) http://www.youtube.com/watch?v=74u4mszivbu 35