Tempo di vita e scope delle variabili

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

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

Lezione 8. Visibilità degli identifcatori e tempo di vita degli oggetti

Funzioni, Stack e Visibilità delle Variabili in C

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggio C I puntatori

Primi passi col linguaggio C

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

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

Strategie di programmazione

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

Strutturare il codice: sottoprogrammi

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

Linguaggio C: introduzione

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Capitolo 5 - Funzioni

Programmazione (imperativa)

Ottenere una modifica del parametro attuale

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

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

Il linguaggio C. Notate che...

Introduzione ai puntatori in C Definizione

Linguaggio C: le funzioni

Espressione di chiamata di funzione

Corso sul linguaggio C Modulo Tipi di dato

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

Funzioni in Linguaggio C

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

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

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

La gestione della memoria dinamica Heap

Header. Unità 9. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

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

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

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

IL PRIMO PROGRAMMA IN C

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Lezione 11. Tipo derivato riferimento Passaggio per riferimento Parametri di ingresso e/o uscita

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

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

Funzioni. Unità 1. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Struct, enum, Puntatori e Array dinamici

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

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Linguaggio C Variabili e tipi di dato

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

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

La gestione dei caratteri in C

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Introduzione al C. Unità Gestione Dinamica della Memoria

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

Introduzione al Linguaggio C Corso di Informatica Laurea in Fisica

nome (lista_parametri) Funzioni funzioni predefinite: sqrt(x) log(x) usare queste funzioni significa: specificare il valore degli argomenti

Algoritmi e basi del C Struttura di un programma

Modulo 2: Strutture fondamentali della programmazione Java

Programmazione a moduli in C

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Il linguaggio C Il linguaggio C. Caratteristiche del C. Caratteristiche del C. Linguaggi di Programmazione I. Ferdinando Cicalese

Array multidimensionali e stringhe

Debug di un programma

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

I puntatori (richiamo)

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

Input/Output di numeri

Procedura. Procedure e funzioni. Esempio di procedura in C. Procedure in C. Esempio con prototipo. Esecuzione del codice

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Struttura dei programmi C

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

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

Gestione dinamica della memoria

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Lezione 8. Sottoprogrammi

La programmazione in linguaggio C

Dove vengono definiti? il concetto di sottoprogramma

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

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

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

Laboratorio di informatica Ingegneria meccanica

Fondamenti di Informatica

Preprocessore, linker e libreria standard

Definizione di metodi in Java

Istruzioni iterative (o cicliche)

Esercizi Array Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

Puntatori. Fondamenti di Programmazione

Capitolo 7 I puntatori in C

1) definizione di una rappresentazione 2) specificazione di un algoritmo (dipendente dalla rappresentazione) 3) traduzione in un linguaggio

Programmazione I - Laboratorio

Tipi di dato primitivi

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

Primo passo: il preprocessor. Il preprocessore. Esempi di direttive al preprocessore: #include. Esempi di direttive al preprocessore: #define

Transcript:

Tempo di vita e scope delle variabili Richiami sulla struttura di un programma C Un programma C deve essere contenuto in uno o più file (salvo diversa specifica, per ora si assume tutto in un unico file): 1. Una parte contenente direttive per il pre-processore: # per l inclusione di librerie (#include) e per la definizione di costanti (#define) 2. Prototipi di eventuali altre funzioni funz1(), funz2, 3. Dichiarazione i della funzione speciale main() 4. Dichiarazione di eventuali funzioni funz1(), funz2(), 5. Dichiarazioni di eventuali costanti/variabili al di fuori delle funzioni Informatica - A.A. 2009/2010 - Scope variabili 2 1

Esempio struttura dei programmi C #include <stdio.h> dichiarazioni; funzione1() { dichiarazioni; istruzioni; funzione2() { dichiarazioni; istruzioni; dichiarazioni; main() { dichiarazioni; istruzioni; Informatica - A.A. 2009/2010 - Scope variabili 3 Concetto di blocco <blocco> ::= { [ <dichiarazioni >; ] Le [ ] indicano la possibilità di presenza o meno <istruzioni>; NOTE dopo un blocco non occorre il punto e virgola (esso termina le istruzioni semplici, non separa istruzioni) i blocchi possono essere innestati posso avere più blocchi dentro una funzione il campo d azione delle <dichiarazioni > che compaiono entro il blocco è il blocco stesso Programmazione - Michele Colajanni, 2004/2005 4 2

Caratteristiche di una variabile (già note) Valore: è rappresentato (secondo la codifica adottata) nell area di memoria associata alla variabile Tipo: specifica la classe di valori che la variabile può assumere (e quindi gli operatori applicabili al valore in essa contenuto) t Informatica - A.A. 2009/2010 - Scope variabili 5 Caratteristiche di una variabile Visibilità (scope): è la parte di programma in cui la variabile è nota e può essere manipolata Tempo di vita: è l intervallo di tempo in cui rimane valida l associazione tra simbolo e indirizzo fisico in memoria NOTA: Scope e tempo di vita possono non coincidere Informatica - A.A. 2009/2010 - Scope variabili 6 3

Scope e Tempo di vita Vi sono tre casi principali di variabili: 1. Variabili dichiarate all interno di un blocco (di una funzione o di un qualsiasi altro blocco) 1. Variabili dichiarate nel blocco del main() 2. Variabili dichiarate all esterno di funzioni Informatica - A.A. 2009/2010 - Scope variabili 7 Caso 1: Variabili interne ad un blocco Il campo d azione delle dichiarazioni che compaiono all interno di un blocco è il blocco stesso Sono visibili (scope): dal momento della dichiarazione fino alla fine del blocco (con un eccezione!) Hanno tempo di vita: dal momento della dichiarazione fino alla fine del blocco (senza eccezioni) ECCEZIONE Se nel blocco compare un blocco innestato in cui è dichiarata una variabile con lo stesso nome, la variabile del blocco esterno rimane in vita, ma non è visibile Informatica - A.A. 2009/2010 - Scope variabili 8 4

Esempio 1 #include <stdio.h> funzione1() { int bz=5; bz++; printf( %d\n,bz); La variabile bz ha tempo di vita e scope limitato a tutto e solo al blocco della funzione1() funzione2() { int abc=1; abc=abc*10; printf( %d\n,abc); Informatica - A.A. 2009/2010 - Scope variabili 9 #include <stdio.h> funzione1() { int bz=5; float ak=3.2; int ps=9;... { int ps; ps=bz+5;... Esempio 2 printf( %d\n,ps); printf( %d\n,ps); Le variabili bz, ak, ps hanno tempo di vita relativo a tutto blocco della funzione1() Informatica - A.A. 2009/2010 - Scope variabili 10? Le variabili bz, ak hanno scope relativo a tutto il blocco della funzione1(). La variabile ps ha scope relativo a tutto il blocco della funzione1() fatta eccezione per il blocco interno.? 5

Caso 2: Variabili del main() In C, le variabili della funzione main() vivono quanto la funzione main(), ovvero hanno tempo di vita pari alla durata del programma ma, in generale, non sono visibili (scope) in qualunque parte del programma, perché main() è una funzione come le altre visibilità delle variabili limitata al blocco in cui sono dichiarate NON SONO VARIABILI CON SCOPE GLOBALE (cioè relativo a qualunque parte del programma)! Informatica - A.A. 2009/2010 - Scope variabili 11 #include <stdio.h> Esempio 3 funzione1() { int bz=5; bz++; La variabile bz ha tempo di vita e scope limitato al blocco della funzione1() main() { int as=10; La variabile as e la variabile xt hanno float xt=0.5; tempo di vita pari alla durata del xt=xt*as; programma, ma scope limitato al funzione1(); blocco del main(). printf( %f\n, xt; NON SONO VISIBILI IN funzione1() Informatica - A.A. 2009/2010 - Scope variabili 12 6

Caso 3: Variabili esterne alle funzioni Dette anche variabili globali Sono visibili (scope) dal momento della dichiarazione (non prima!) fino alla fine del file (con un eccezione) Hanno tempo di vita della dichiarazione fino alla fine del file Se il programma consiste di un solo file, il tempo di vita coincide con la durata dell esecuzione esecuzione del programma ECCEZIONE Se nel blocco di altre funzioni è dichiarata una variabile con lo stesso nome, la variabile esterna rimane in vita, ma non è visibile all interno di quel blocco Informatica - A.A. 2009/2010 - Scope variabili 13 Struttura generale di un programma C all interno di un unico file Esempio #include <stdio.h> dichiarazioni; funzione1() { dichiarazioni; istruzioni; funzione2() { dichiarazioni; istruzioni; dichiarazioni; main() { dichiarazioni; istruzioni; Informatica - A.A. 2009/2010 - Scope variabili 14 7

Esempio 4 #include <stdio.h> int x=0; funct1() { x = x + 3; funct2() { float x = 2.14; /* è un altra x! */ funct1(); printf( %f\n,x); /* x =?? */ main() { x++; printf( %d\n,x); /* x =?? */ funct2(); printf( %d\n,x); /* x =?? */ Informatica - A.A. 2009/2010 - Scope variabili 15 1 4 2.14 Concetto di File Blocco Funzione Parole chiave della lezione Visibilità (scope) delle variabili Tempo di vita delle variabili Tre tipologie di variabili (dipendenti dalle dichiarazioni) Informatica - A.A. 2009/2010 - Scope variabili 16 8

Nota sul passaggio dei parametri in C Lista dei parametri Parametri formali: argomenti dichiarati nella definizione di funzione Parametri attuali: argomenti inseriti al momento della chiamata di funzione Possono essere espressioni (costanti, variabili, espressioni aritmetiche, ) Informatica - A.A. 2009/2010 - Scope variabili 18 9

Lista dei parametri Non appena l ambiente della funzione chiamata viene attivato, i parametri formali vengono dichiarati (come variabili locali all ambiente ambiente della funzione) ed inizializzati al valore del corrispondente parametro attuale La corrispondenza tra parametri formali e attuali è posizionale e di tipo Si presume che la lista dei parametri formali e la lista dei parametri attuali abbia lo stesso numero e tipo di elementi I nomi dei parametri attuali e formali non hanno importanza, possono essere gli stessi o diversi: l associazione viene fatta solo in base alla posizione Informatica - A.A. 2009/2010 - Scope variabili 19 Passaggio dei parametri Per passaggio dei parametri si intende l associazione fra parametri attuali e parametri formali che avviene al momento della chiamata di una funzione Il meccanismo adottato in C, si chiama PASSAGGIO PER VALORE Non è il solo meccanismo possibile Altri linguaggi forniscono anche: Passaggio per indirizzo (o riferimento) Passaggio per valore-risultato Informatica - A.A. 2009/2010 - Scope variabili 20 10

Passaggio dei parametri per valore Le locazioni di memoria corrispondenti ai parametri formali: Sono allocate al momento della chiamata della funzione Sono inizializzate con i valori dei corrispondenti parametri attuali trasmessi dalla funzione chiamante Vivono per tutto il tempo in cui la funzione è in esecuzione Sono deallocate quando la funzione termina QUINDI La funzione chiamata riceve copia dei valori dei parametri attuali passati dalla funzione chiamante Tali copie sono sue copie private che servono solo per inizializzare i parametri formali Ogni modifica ai parametri formali è strettamente locale alla funzione I parametri attuali della funzione chiamante non saranno mai modificati! Informatica - A.A. 2009/2010 - Scope variabili 21 Esempio Prototipo di funzione double CalcDistance (int, int, int, int); Definizioneione di funzione double CalcDistance (int px1, int py1, int px2, int py2) { px1 = pow (abs (px1 - px2), 2); py1 = pow (abs (py1 - py2), 2); return (sqrt (double (px1 + py1)); Chiamata di funzione int a= 9, b= 5, c=4, d=12; double k; k = CalcDistance (a, b, c, d); printf ( %d - %d - %d - %d; %f\n, a, b, c, d, k); Il collegamento tra parametri formali e parametri attuali si ha solo al momento della chiamata. Sebbene px1 e py1 vengano modificati all interno della funzione, i valori dei corrispondenti parametri attuali (a, b) rimangono inalterati. Informatica - A.A. 2009/2010 - Scope variabili 22 11

Esempio 2 int potenza(int x, int n) { int i = 1; /* variabile ausiliaria */ int p = 1; while (i <= n) { p = p*x; i++ return (p); main() { int ris, base=4, esponente=3; ris = potenza(base,esponente); printf( %d elevato alla %d = %d\n, base, esponente, ris); Stampa 4 elevato alla 3 = 64 Informatica - A.A. 2009/2010 - Scope variabili 23 Esempio 2bis int potenza(int x, int n) { /* senza variabile ausiliaria */ int p = 1; while ((n--) )> 0)) p = p*x; return (p); Anche se il parametro formale n viene modificato, la variabile esponente non viene alterata! main() E il suo valore (3) che viene passato alla funzione. { int ris, base=4, esponente=3; ris = potenza(base,esponente); printf( %d elevato alla %d = %d\n, base, esponente, ris); Stampa 4 elevato alla 3 = 64 Informatica - A.A. 2009/2010 - Scope variabili 24 12

Perché il C adotta il passaggio per valore? E sicuro: le variabili del chiamante e del chiamato sono completamente disaccoppiate Consente di ragionare per componenti e servizi: la struttura interna dei singoli componenti è irrilevante (la funzione può anche modificare i parametri ricevuti senza che ciò abbia impatto sul chiamante) LIMITE La semantica per copia impedisce a priori di scrivere funzioni che abbiano come scopo quello di modificare i dati passati dall ambiente chiamante Informatica - A.A. 2009/2010 - Scope variabili 25 Esercizio 3 (Specifica) Scrivere una funzione che scambi due valori A e B (di tipo int) Cioè che metta in A il valore di B e in B il valore di A Informatica - A.A. 2009/2010 - Scope variabili 26 13

Esercizio 3 (Idea e Algoritmo) Effettuare una triangolazione fra A, B e una variabile ausiliaria i T Salvare in T il valore di A, poi assegnare ad A il valore di B, quindi assegnare a B il valore di T (cioè il vecchio valore di A) Informatica - A.A. 2009/2010 - Scope variabili 27 Esercizio 3 (Programma) void scambia(int A, int B) { int t; t = A; A = B; B = t; main() { int x = 12, y = 27; printf( x=%d y=%d\n, x, y); scambia(x, y); printf( x=%d y=%d\n, x, y); Stampa (voluta) x=12 y=27 Stampa vera x=12 y=27 x=27 y=12 x=12 y=27 MOTIVO: Semantica del passaggio di parametri per valore. La funzione scambia ha scambiato A e B al suo interno, ma questa modifica non si è propagata ai parametri attuali Informatica - A.A. 2009/2010 - Scope variabili 28 14

Passaggio dei parametri per riferimento Per superare i limiti della semantica per copia, occorre consentire alla funzione di far riferimento alle variabili effettive del chiamante IL CONCETTO DI RIFERIMENTO Una funzione deve poter dichiarare nella sua intestazione che un parametro costituisce un riferimento: il parametro formale non è più una variabile locale inizializzata al valore del parametro attuale, ma è un riferimento alla variabile originale (parametro attuale) nell ambiente della funzione chiamante ogni modifica fatta al parametro formale in realtà viene effettuata sul parametro attuale della funzione chiamante Il passaggio per riferimento è disponibile in molti linguaggi (Pascal, C++), ma NON è disponibile in C deve essere simulato tramite puntatori Informatica - A.A. 2009/2010 - Scope variabili 29 15