SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
Riferimenti e funzioni
 (Passaggio dei parametri
     per riferimento)
Esercizio

• Scrivere una funzione che scambi due valori A
  e B (di tipo int)




Programmazione I - Paolo Valente, 2008/2009        2
Idea e Algoritmo

• Effettuare una “triangolazione” fra A, B e una
  variabile ausiliaria 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)




Programmazione I - Paolo Valente, 2008/2009            3
Programma
  void scambia(int A, int B)
   { int t = A; A = B; B = t; }
                                              Stampa voluta   Stampa vera

                                              x=12   y=27     x=12   y=27
  main()
  {                             x=27                 y=12     x=12   y=27
    int x = 12, y = 27;
    cout<<“x=”<<x<<” y=”<<y<<endl ;
    scambia(x, y);
    cout<<“x=”<<x<<” y=”<<y<<endl ;
  }
          MOTIVO: Semantica del passaggio di parametri per valore.
          La funzione scambia ha scambiato la propria copia dei valori di
          A e B ma questa modifica non si è propagata ai parametri attuali
Programmazione I - Paolo Valente, 2008/2009                             4
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. In tal caso:
    – il parametro formale non è più una variabile locale inizializzata al valore del
      parametro attuale, ma è un riferimento alla variabile originale (passata
      come parametro attuale) nell’ambiente della funzione chiamante
    – quindi, ogni modifica fatta al parametro formale in realtà viene effettuata
      sulla variabile della funzione chiamante passata come parametro attuale (le
      modifiche si propagano)
•   Il passaggio per riferimento è disponibile in molti linguaggi
    (Pascal, C++), ma NON è disponibile in C, nel quale deve essere
    simulato tramite puntatori

    Saremo presto in grado di realizzare la versione corretta del
•
    programma C/C++ che realizza la funzione scambia(), non appena
    introdotto il tipo derivato riferimento
Programmazione I - Paolo Valente, 2008/2009                                         5
Tipi di dato


                                                           Derivati
      Scalari,
    Fondamentali,
     Primitivi o
     Aritmetici
                                              Riferimenti Strutturati   Puntatori


      predefiniti             enumerati
        bool                     enum
        char
        int
         float
         double

Programmazione I - Paolo Valente, 2008/2009                                    6
Riferimento
• Un riferimento è un identificatore associato all'indirizzo di
  un oggetto

• Quando si dichiara un oggetto (costante, variabile,
  funzione, ...) gli si assegna un riferimento di default, ossia
  quello che finora abbiamo chiamato nome dell'oggetto

      – Es.:
        int a ; // l'dentificatore a è il riferimento di
                   default alla variabile di nome a

• Oltre a quello di default, in C++ (non in C) è possibile
  definire ulteriori riferimenti ad un oggetto
      – Rappresenteranno dei sinonimi (alias)
Programmazione I - Paolo Valente, 2008/2009                        7
Riferimenti come variabili
                        locali o globali
• <definizione_riferimento> ::=
      <tipo_riferimento> <identificatore> = <nome_oggetto>
  <tipo_riferimento> ::=
      <tipo_oggetto> &


• Es:
  int i = 10 ;
  int & rif_ad_i = i ;
  rif_ad_i = 5 ;

     cout<<i<<quot; quot;<<rif_ad_i<<endl ;

• Cosa stampa ?

Programmazione I - Paolo Valente, 2008/2009              8
Riferimenti come variabili
                        locali o globali
• Una volta definito ed inizializzato, un riferimento si riferisce
  per sempre allo stesso oggetto

• Nell'esempio precedente:

                                                     i   10
int i = 10 ;

                                                     i
int & rif_ad_i = i ;
                                                         10
                                              rif_ad_i

                                                     i
rif_ad_i = 5 ;
                                                          5
                                              rif_ad_i
Programmazione I - Paolo Valente, 2008/2009                      9
Passaggio dei parametri per riferimento

• La versione corretta del programma C++ che
  realizza la funzione scambia() necessita di un
  passaggio di parametri per riferimento

• In pratica, per superare i limiti della semantica per
  copia, occorre consentire alla funzione di far
  riferimento alle variabili visibili nella funzione
  chiamante




Programmazione I - Paolo Valente, 2008/2009               10
Principî del passaggio per riferimento
• Una funzione deve poter dichiarare, nella sua
  intestazione, che un parametro costituisce un
  riferimento
• In tal caso:
     – il parametro formale indicato come riferimento non è più
       una variabile locale inizializzata al valore del parametro
       attuale, ma è un riferimento alla variabile originale
       passata dalla funzione chiamante come parametro
       attuale
     – quindi, ogni modifica fatta al parametro formale, in realtà
       viene effettuata sul parametro attuale della funzione
       chiamante (le modifiche fatte dall’ambiente chiamato si
       propagano all’ambiente chiamante)

Programmazione I - Paolo Valente, 2008/2009                     11
Riferimenti come parametri formali
• <definizione_param_formale_riferimento> ::=
      <tipo_riferimento> identificatore
  <tipo_riferimento> ::=
      <tipo_oggetto> &

• Esempio:
  Scrivere una funzione raddoppia che prenda in
  ingresso (parametro formale) un oggetto di tipo
  intero e ne raddoppi il valore




Programmazione I - Paolo Valente, 2008/2009         12
Riferimenti come parametri formali
#include <iostream>
using namespace std ;

void raddoppia(int &a)
{
   a *= 2 ;
}

int main()
{
   int b ;
   cin>>b ;
   raddoppia(b) ;
   cout<<b<<endl ;
}
Programmazione I - Paolo Valente, 2008/2009   13
Esercizio ...
• Dalle slide di esercitazione:
      – funz_moltiplica.cc




Programmazione I - Paolo Valente, 2008/2009           14
Finalmente la funzione “scambia”
void scambia(int &A, int &B)
 { int t;
   t = A; A = B; B = t;
 }

main()
{                                              Stampa
  int x = 12, y = 27;
  cout<<“x=”<<x<<” y=”<<y<<endl ;              x=12   y=27
  scambia(x, y);
  cout<<“x=”<<x<<” y=”<<y<<endl ;              x=27   y=12
}
   E' cambiato qualcosa nel main (ossia nell'invo-
   cazione) rispetto alla precedente versione ???
 Programmazione I - Paolo Valente, 2008/2009                 15
Problemi passaggio per riferimento
• Dalla sola chiamata di una funzione non si può
  distinguere tra un passaggio per valore ed uno
  per riferimento
• Perché i passaggi per riferimento possono essere
  pericolosi?




Programmazione I - Paolo Valente, 2008/2009        16
Effetti collaterali
• Si ha un effetto collaterale
      – Di una parte A di un programma su un'altra
        parte B
      – se la parte A modifica variabili visibili nella
        parte B
      – Es: una funzione modifica variabili visibili in
        un'altra
• Può essere utilizzato come metodo di interazione
  tra parti di un programma
• Se non previsto o voluto può portare ad errori
  difficili da scoprire
Programmazione I - Paolo Valente, 2008/2009               17
Attenzione: Effetti collaterali
float a, b;
 
float R (float& x)
  {
   x *= 2;
   return x;
  }
 
  main()
                                              Stampa
   {
    a=1.0;
                                                4
    b=2*R(a); cout<<b<<endl;
    a=1.0;
    b=R(a)+R(a); cout<<b<<endl;                 6
   }

Programmazione I - Paolo Valente, 2008/2009            18
Effetti collaterali

• I riferimenti forniscono quindi un
  meccanismo per avere effetti collaterali

• E' l'unico ???




Programmazione I - Paolo Valente, 2008/2009         19
Riassunto interazioni tra parti di un
               programma

• Valore di ritorno delle funzioni

• Effetti collaterali

    – Variabili globali

    – Riferimenti
• In generale è meglio passare valori alle
  funzioni ed utilizzarne il valore di ritorno
  piuttosto che sfruttare effetti collaterali
Programmazione I - Paolo Valente, 2008/2009      20
Implementazione riferimenti 1/3
• A basso livello il compilatore realizza un riferimento
  mediante una variabile nascosta in cui memorizza
  l'indirizzo dell'oggetto di cui il riferimento è un
  sinonimo

• Ad esempio, dato
  int &a = b ;
  Il compilatore memorizza in una variabile nascosta
  l'indirizzo di b, ed usa tale indirizzo tutte le volte
  che si deve accedere a b attraverso il riferimento a



Programmazione I - Paolo Valente, 2008/2009            21
Implementazione riferimenti 2/3
• Pertanto, se si passa un oggetto per riferimento, di
  fatto si passa solo l'indirizzo dell'oggetto

• Come vedremo, mediante i tipi derivati si possono
  definire oggetti molto grandi (ossia che occupano
  molte celle di memoria)
    – Il passaggio per valore di un oggetto diviene
      tanto più costoso, sia in termini di tempo che di
      occupazione di memoria, quanto più grande è
      l'oggetto da passare (si deve copiare l'intero
      oggetto nel parametro formale)

Programmazione I - Paolo Valente, 2008/2009               22
Implementazione riferimenti 3/3
• Al contrario, il passaggio di un oggetto per
  riferimento ha sempre lo stesso costo,
  indipendentemente dalle dimensioni dell'oggetto
  passato

• E' quindi molto più conveniente passare un oggetto
  molto grande per riferimento rispetto a passarlo
  per valore

• Rispetto al passaggio per valore c'è però il
  problema degli effetti collaterali!

• Come risolverlo ?
Programmazione I - Paolo Valente, 2008/2009         23
Riferimenti ad oggetti costanti
• Se si aggiunge il qualificatore const nella
  definizione di un riferimento, non si potrà mai
  modificare l'oggetto acceduto attraverso quel
  riferimento

• Es.:
  int fun(const int &a)
  {
       a = 3 ; // ILLEGALE, non compila
  }

• Pertanto, mediante il passaggio per riferimento ad
  oggetto costante possiamo realizzare il passaggio
  per valore a costo costante
Programmazione I - Paolo Valente, 2008/2009            24
Direzione parametri 1/3
• Un ultimo aspetto importante nell'interazione tra
  parti di un programma è la direzione dei parametri
  delle funzioni
      – Parametri di ingresso: valori o oggetti su cui
        lavorerà la funzione
         o Questo tipo di passaggio si può

           implementare ad esempio con il passaggio
           per valore o con il passaggio per riferimento
           ad oggetto costante



Programmazione I - Paolo Valente, 2008/2009                25
Direzione parametri 2/3
      – Parametri di uscita: oggetti che non saranno
        mai usati in lettura, ma solo per memorizzare
        dei valori di ritorno
         o Permettono di fatto di realizzare funzioni con

           un vettore di valori di ritorno
            –Mediante l'istruzione return si comunica il
              valore di ritorno della funzione in senso
              stretto, mentre negli altri parametri di
              uscita si memorizzano gli altri eventuali
              valori di ritorno


Programmazione I - Paolo Valente, 2008/2009             26
Direzione parametri 3/3
      – Parametri di ingresso/uscita: oggetti usati sia
        come parametri di ingresso che come
        parametri di uscita




Programmazione I - Paolo Valente, 2008/2009               27
Restituzione di più di un risultato ...
• Definire una funzione che prenda in ingresso un
  oggetto di tipo carattere e, se si tratta di un
  carattere minuscolo, lo trasformi nel
  corrispondente carattere maiuscolo. La funzione
  deve ritornare vero se la conversione è avvenuta,
  falso altrimenti.
• Tipo dei parametri?
• Tipo del valore di ritorno?
• Ci sono parametri di ingresso/uscita?

Programmazione I - Paolo Valente, 2008/2009       28
Soluzione
/*
 * Funzione che dato un carattere in ingresso, se si tratta di un
 * carattere minuscolo lo trasforma in maiuscolo e ritorna
 * vero; in caso contrario lo lascia invariato e ritorna falso
*/
bool maiuscolo(char &c)
{
   if (c<'a' || c>'z')
           return false ;
    c = c – 'a' + 'A' ;
   return true ;
 }




Programmazione I - Paolo Valente, 2008/2009                     29
Riferimento come tipo di ritorno
• Una funzione può avere un riferimento anche
  come tipo di ritorno

• Questo permette di “legare” due variabili
  mediante una funzione




Programmazione I - Paolo Valente, 2008/2009     30
Riferimento come tipo di ritorno

     int & fun(int &a)
     {
          return a ;
     }

     main()
                             Cosa             stampa?
     {
          int c = 10 ;
          int &b = fun(c) ;
          b++ ;
          cout<<b<<quot; quot;<<c<<endl ;
     }

Programmazione I - Paolo Valente, 2008/2009             31
Riferimento come tipo di ritorno

     int a = 10 ;
     int & fun()
     {
          return a ;
     }

                             Cosa             stampa?
     main()
     {
          int &b = fun() ;
          b++ ;
          cout<<b<<quot; quot;<<a<<endl ;
     }

Programmazione I - Paolo Valente, 2008/2009             32
Attenzione !!!
     int & fun()
     {
                                              E' corretto?
          int d = 3 ;
          return d ;
     }                                        Qual è il tempo di vita
                                              della variabile d?
     main()
     {
          int &b = fun() ;
          b++ ;
          cout<<b<<endl ;
     }


Programmazione I - Paolo Valente, 2008/2009                         33
Attenzione !!!
• Ritornare un riferimento ad una variabile locale è
  un errore logico

• E' anche un errore di gestione della memoria
      – Il compilatore può non segnalare l'errore
      – Se poi si assegnano valori tramite tali
        riferimenti si può corrompere la memoria del
        programma




Programmazione I - Paolo Valente, 2008/2009            34
Passaggio parametri per riferimento in C


    Come già detto, il passaggio per riferimento è
    disponibile in molti linguaggi di alto livello
    (C++, Pascal), ma non in tutti.
    In particolare, NON è disponibile in C, e quindi
    in C deve essere simulato tramite l’uso di
    puntatori


 Programmazione I - Paolo Valente, 2008/2009           35

Weitere ähnliche Inhalte

Was ist angesagt?

Android - Tp3 - intents
Android - Tp3 -  intentsAndroid - Tp3 -  intents
Android - Tp3 - intentsLilia Sfaxi
 
Les listes simplement chaînées en langage C
Les listes simplement chaînées en langage CLes listes simplement chaînées en langage C
Les listes simplement chaînées en langage CMohamed Lahby
 
Submodularity slides
Submodularity slidesSubmodularity slides
Submodularity slidesdragonthu
 
Style & Design Principles 03 - Component-Based Entity Systems
Style & Design Principles 03 - Component-Based Entity SystemsStyle & Design Principles 03 - Component-Based Entity Systems
Style & Design Principles 03 - Component-Based Entity SystemsNick Pruehs
 
6 Vettori E Matrici
6   Vettori E Matrici6   Vettori E Matrici
6 Vettori E Matriciguest60e9511
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...Shengyou Fan
 
Cours algo: Les pointeurs
Cours algo: Les pointeursCours algo: Les pointeurs
Cours algo: Les pointeursSana REFAI
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)rezgui mohamed
 
Développer des codes de simulation numérique avec une équipe "non geek" à l'ULg
Développer des codes de simulation numérique avec une équipe "non geek" à l'ULgDévelopper des codes de simulation numérique avec une équipe "non geek" à l'ULg
Développer des codes de simulation numérique avec une équipe "non geek" à l'ULgRomain Boman
 
Virtual base class
Virtual base classVirtual base class
Virtual base classTech_MX
 
Operator overloading
Operator overloadingOperator overloading
Operator overloadingBurhan Ahmed
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en cbenouini rachid
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
Basic Concepts of OOPs (Object Oriented Programming in Java)
Basic Concepts of OOPs (Object Oriented Programming in Java)Basic Concepts of OOPs (Object Oriented Programming in Java)
Basic Concepts of OOPs (Object Oriented Programming in Java)Michelle Anne Meralpis
 

Was ist angesagt? (20)

Android - Tp3 - intents
Android - Tp3 -  intentsAndroid - Tp3 -  intents
Android - Tp3 - intents
 
Les listes simplement chaînées en langage C
Les listes simplement chaînées en langage CLes listes simplement chaînées en langage C
Les listes simplement chaînées en langage C
 
Submodularity slides
Submodularity slidesSubmodularity slides
Submodularity slides
 
Style & Design Principles 03 - Component-Based Entity Systems
Style & Design Principles 03 - Component-Based Entity SystemsStyle & Design Principles 03 - Component-Based Entity Systems
Style & Design Principles 03 - Component-Based Entity Systems
 
Oop
OopOop
Oop
 
6 Vettori E Matrici
6   Vettori E Matrici6   Vettori E Matrici
6 Vettori E Matrici
 
Oop concepts
Oop conceptsOop concepts
Oop concepts
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
 
Cours algo: Les pointeurs
Cours algo: Les pointeursCours algo: Les pointeurs
Cours algo: Les pointeurs
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 
Développer des codes de simulation numérique avec une équipe "non geek" à l'ULg
Développer des codes de simulation numérique avec une équipe "non geek" à l'ULgDévelopper des codes de simulation numérique avec une équipe "non geek" à l'ULg
Développer des codes de simulation numérique avec une équipe "non geek" à l'ULg
 
Operators and Expressions
Operators and ExpressionsOperators and Expressions
Operators and Expressions
 
Virtual base class
Virtual base classVirtual base class
Virtual base class
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en c
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Basic Concepts of OOPs (Object Oriented Programming in Java)
Basic Concepts of OOPs (Object Oriented Programming in Java)Basic Concepts of OOPs (Object Oriented Programming in Java)
Basic Concepts of OOPs (Object Oriented Programming in Java)
 

Ähnlich wie 08 - Programmazione: Passaggio valori tra funzioni per riferimenti

06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope VariabiliMajong DevJfu
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio cughetta
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: FunzioniMajong DevJfu
 
13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++Majong DevJfu
 
07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioniMajong DevJfu
 
Laboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliLaboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliMajong DevJfu
 
03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++Majong DevJfu
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)STELITANO
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Ripasso funzioni
Ripasso funzioniRipasso funzioni
Ripasso funzionimarckmart
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java BaseK-Tech Formazione
 
09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del Codice09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del CodiceMajong DevJfu
 
04 Progettazione Logica
04  Progettazione Logica04  Progettazione Logica
04 Progettazione Logicaguestbe916c
 

Ähnlich wie 08 - Programmazione: Passaggio valori tra funzioni per riferimenti (20)

7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio c
 
La scomposizione in sotto programmi in C++.pptx
La scomposizione in sotto programmi in C++.pptxLa scomposizione in sotto programmi in C++.pptx
La scomposizione in sotto programmi in C++.pptx
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: Funzioni
 
13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++
 
La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++
 
07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Laboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliLaboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabili
 
03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Ripasso funzioni
Ripasso funzioniRipasso funzioni
Ripasso funzioni
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
07 1 funzioni
07 1 funzioni07 1 funzioni
07 1 funzioni
 
09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del Codice09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del Codice
 
04 Progettazione Logica
04  Progettazione Logica04  Progettazione Logica
04 Progettazione Logica
 

Mehr von Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 

Mehr von Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

08 - Programmazione: Passaggio valori tra funzioni per riferimenti

  • 1. Riferimenti e funzioni (Passaggio dei parametri per riferimento)
  • 2. Esercizio • Scrivere una funzione che scambi due valori A e B (di tipo int) Programmazione I - Paolo Valente, 2008/2009 2
  • 3. Idea e Algoritmo • Effettuare una “triangolazione” fra A, B e una variabile ausiliaria 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) Programmazione I - Paolo Valente, 2008/2009 3
  • 4. Programma void scambia(int A, int B) { int t = A; A = B; B = t; } Stampa voluta Stampa vera x=12 y=27 x=12 y=27 main() { x=27 y=12 x=12 y=27 int x = 12, y = 27; cout<<“x=”<<x<<” y=”<<y<<endl ; scambia(x, y); cout<<“x=”<<x<<” y=”<<y<<endl ; } MOTIVO: Semantica del passaggio di parametri per valore. La funzione scambia ha scambiato la propria copia dei valori di A e B ma questa modifica non si è propagata ai parametri attuali Programmazione I - Paolo Valente, 2008/2009 4
  • 5. 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. In tal caso: – il parametro formale non è più una variabile locale inizializzata al valore del parametro attuale, ma è un riferimento alla variabile originale (passata come parametro attuale) nell’ambiente della funzione chiamante – quindi, ogni modifica fatta al parametro formale in realtà viene effettuata sulla variabile della funzione chiamante passata come parametro attuale (le modifiche si propagano) • Il passaggio per riferimento è disponibile in molti linguaggi (Pascal, C++), ma NON è disponibile in C, nel quale deve essere simulato tramite puntatori Saremo presto in grado di realizzare la versione corretta del • programma C/C++ che realizza la funzione scambia(), non appena introdotto il tipo derivato riferimento Programmazione I - Paolo Valente, 2008/2009 5
  • 6. Tipi di dato Derivati Scalari, Fondamentali, Primitivi o Aritmetici Riferimenti Strutturati Puntatori predefiniti enumerati bool enum char int float double Programmazione I - Paolo Valente, 2008/2009 6
  • 7. Riferimento • Un riferimento è un identificatore associato all'indirizzo di un oggetto • Quando si dichiara un oggetto (costante, variabile, funzione, ...) gli si assegna un riferimento di default, ossia quello che finora abbiamo chiamato nome dell'oggetto – Es.: int a ; // l'dentificatore a è il riferimento di default alla variabile di nome a • Oltre a quello di default, in C++ (non in C) è possibile definire ulteriori riferimenti ad un oggetto – Rappresenteranno dei sinonimi (alias) Programmazione I - Paolo Valente, 2008/2009 7
  • 8. Riferimenti come variabili locali o globali • <definizione_riferimento> ::= <tipo_riferimento> <identificatore> = <nome_oggetto> <tipo_riferimento> ::= <tipo_oggetto> & • Es: int i = 10 ; int & rif_ad_i = i ; rif_ad_i = 5 ; cout<<i<<quot; quot;<<rif_ad_i<<endl ; • Cosa stampa ? Programmazione I - Paolo Valente, 2008/2009 8
  • 9. Riferimenti come variabili locali o globali • Una volta definito ed inizializzato, un riferimento si riferisce per sempre allo stesso oggetto • Nell'esempio precedente: i 10 int i = 10 ; i int & rif_ad_i = i ; 10 rif_ad_i i rif_ad_i = 5 ; 5 rif_ad_i Programmazione I - Paolo Valente, 2008/2009 9
  • 10. Passaggio dei parametri per riferimento • La versione corretta del programma C++ che realizza la funzione scambia() necessita di un passaggio di parametri per riferimento • In pratica, per superare i limiti della semantica per copia, occorre consentire alla funzione di far riferimento alle variabili visibili nella funzione chiamante Programmazione I - Paolo Valente, 2008/2009 10
  • 11. Principî del passaggio per riferimento • Una funzione deve poter dichiarare, nella sua intestazione, che un parametro costituisce un riferimento • In tal caso: – il parametro formale indicato come riferimento non è più una variabile locale inizializzata al valore del parametro attuale, ma è un riferimento alla variabile originale passata dalla funzione chiamante come parametro attuale – quindi, ogni modifica fatta al parametro formale, in realtà viene effettuata sul parametro attuale della funzione chiamante (le modifiche fatte dall’ambiente chiamato si propagano all’ambiente chiamante) Programmazione I - Paolo Valente, 2008/2009 11
  • 12. Riferimenti come parametri formali • <definizione_param_formale_riferimento> ::= <tipo_riferimento> identificatore <tipo_riferimento> ::= <tipo_oggetto> & • Esempio: Scrivere una funzione raddoppia che prenda in ingresso (parametro formale) un oggetto di tipo intero e ne raddoppi il valore Programmazione I - Paolo Valente, 2008/2009 12
  • 13. Riferimenti come parametri formali #include <iostream> using namespace std ; void raddoppia(int &a) { a *= 2 ; } int main() { int b ; cin>>b ; raddoppia(b) ; cout<<b<<endl ; } Programmazione I - Paolo Valente, 2008/2009 13
  • 14. Esercizio ... • Dalle slide di esercitazione: – funz_moltiplica.cc Programmazione I - Paolo Valente, 2008/2009 14
  • 15. Finalmente la funzione “scambia” void scambia(int &A, int &B) { int t; t = A; A = B; B = t; } main() { Stampa int x = 12, y = 27; cout<<“x=”<<x<<” y=”<<y<<endl ; x=12 y=27 scambia(x, y); cout<<“x=”<<x<<” y=”<<y<<endl ; x=27 y=12 } E' cambiato qualcosa nel main (ossia nell'invo- cazione) rispetto alla precedente versione ??? Programmazione I - Paolo Valente, 2008/2009 15
  • 16. Problemi passaggio per riferimento • Dalla sola chiamata di una funzione non si può distinguere tra un passaggio per valore ed uno per riferimento • Perché i passaggi per riferimento possono essere pericolosi? Programmazione I - Paolo Valente, 2008/2009 16
  • 17. Effetti collaterali • Si ha un effetto collaterale – Di una parte A di un programma su un'altra parte B – se la parte A modifica variabili visibili nella parte B – Es: una funzione modifica variabili visibili in un'altra • Può essere utilizzato come metodo di interazione tra parti di un programma • Se non previsto o voluto può portare ad errori difficili da scoprire Programmazione I - Paolo Valente, 2008/2009 17
  • 18. Attenzione: Effetti collaterali float a, b;   float R (float& x) { x *= 2; return x; }   main() Stampa { a=1.0; 4 b=2*R(a); cout<<b<<endl; a=1.0; b=R(a)+R(a); cout<<b<<endl; 6 } Programmazione I - Paolo Valente, 2008/2009 18
  • 19. Effetti collaterali • I riferimenti forniscono quindi un meccanismo per avere effetti collaterali • E' l'unico ??? Programmazione I - Paolo Valente, 2008/2009 19
  • 20. Riassunto interazioni tra parti di un programma • Valore di ritorno delle funzioni • Effetti collaterali – Variabili globali – Riferimenti • In generale è meglio passare valori alle funzioni ed utilizzarne il valore di ritorno piuttosto che sfruttare effetti collaterali Programmazione I - Paolo Valente, 2008/2009 20
  • 21. Implementazione riferimenti 1/3 • A basso livello il compilatore realizza un riferimento mediante una variabile nascosta in cui memorizza l'indirizzo dell'oggetto di cui il riferimento è un sinonimo • Ad esempio, dato int &a = b ; Il compilatore memorizza in una variabile nascosta l'indirizzo di b, ed usa tale indirizzo tutte le volte che si deve accedere a b attraverso il riferimento a Programmazione I - Paolo Valente, 2008/2009 21
  • 22. Implementazione riferimenti 2/3 • Pertanto, se si passa un oggetto per riferimento, di fatto si passa solo l'indirizzo dell'oggetto • Come vedremo, mediante i tipi derivati si possono definire oggetti molto grandi (ossia che occupano molte celle di memoria) – Il passaggio per valore di un oggetto diviene tanto più costoso, sia in termini di tempo che di occupazione di memoria, quanto più grande è l'oggetto da passare (si deve copiare l'intero oggetto nel parametro formale) Programmazione I - Paolo Valente, 2008/2009 22
  • 23. Implementazione riferimenti 3/3 • Al contrario, il passaggio di un oggetto per riferimento ha sempre lo stesso costo, indipendentemente dalle dimensioni dell'oggetto passato • E' quindi molto più conveniente passare un oggetto molto grande per riferimento rispetto a passarlo per valore • Rispetto al passaggio per valore c'è però il problema degli effetti collaterali! • Come risolverlo ? Programmazione I - Paolo Valente, 2008/2009 23
  • 24. Riferimenti ad oggetti costanti • Se si aggiunge il qualificatore const nella definizione di un riferimento, non si potrà mai modificare l'oggetto acceduto attraverso quel riferimento • Es.: int fun(const int &a) { a = 3 ; // ILLEGALE, non compila } • Pertanto, mediante il passaggio per riferimento ad oggetto costante possiamo realizzare il passaggio per valore a costo costante Programmazione I - Paolo Valente, 2008/2009 24
  • 25. Direzione parametri 1/3 • Un ultimo aspetto importante nell'interazione tra parti di un programma è la direzione dei parametri delle funzioni – Parametri di ingresso: valori o oggetti su cui lavorerà la funzione o Questo tipo di passaggio si può implementare ad esempio con il passaggio per valore o con il passaggio per riferimento ad oggetto costante Programmazione I - Paolo Valente, 2008/2009 25
  • 26. Direzione parametri 2/3 – Parametri di uscita: oggetti che non saranno mai usati in lettura, ma solo per memorizzare dei valori di ritorno o Permettono di fatto di realizzare funzioni con un vettore di valori di ritorno –Mediante l'istruzione return si comunica il valore di ritorno della funzione in senso stretto, mentre negli altri parametri di uscita si memorizzano gli altri eventuali valori di ritorno Programmazione I - Paolo Valente, 2008/2009 26
  • 27. Direzione parametri 3/3 – Parametri di ingresso/uscita: oggetti usati sia come parametri di ingresso che come parametri di uscita Programmazione I - Paolo Valente, 2008/2009 27
  • 28. Restituzione di più di un risultato ... • Definire una funzione che prenda in ingresso un oggetto di tipo carattere e, se si tratta di un carattere minuscolo, lo trasformi nel corrispondente carattere maiuscolo. La funzione deve ritornare vero se la conversione è avvenuta, falso altrimenti. • Tipo dei parametri? • Tipo del valore di ritorno? • Ci sono parametri di ingresso/uscita? Programmazione I - Paolo Valente, 2008/2009 28
  • 29. Soluzione /* * Funzione che dato un carattere in ingresso, se si tratta di un * carattere minuscolo lo trasforma in maiuscolo e ritorna * vero; in caso contrario lo lascia invariato e ritorna falso */ bool maiuscolo(char &c) { if (c<'a' || c>'z') return false ; c = c – 'a' + 'A' ; return true ; } Programmazione I - Paolo Valente, 2008/2009 29
  • 30. Riferimento come tipo di ritorno • Una funzione può avere un riferimento anche come tipo di ritorno • Questo permette di “legare” due variabili mediante una funzione Programmazione I - Paolo Valente, 2008/2009 30
  • 31. Riferimento come tipo di ritorno int & fun(int &a) { return a ; } main() Cosa stampa? { int c = 10 ; int &b = fun(c) ; b++ ; cout<<b<<quot; quot;<<c<<endl ; } Programmazione I - Paolo Valente, 2008/2009 31
  • 32. Riferimento come tipo di ritorno int a = 10 ; int & fun() { return a ; } Cosa stampa? main() { int &b = fun() ; b++ ; cout<<b<<quot; quot;<<a<<endl ; } Programmazione I - Paolo Valente, 2008/2009 32
  • 33. Attenzione !!! int & fun() { E' corretto? int d = 3 ; return d ; } Qual è il tempo di vita della variabile d? main() { int &b = fun() ; b++ ; cout<<b<<endl ; } Programmazione I - Paolo Valente, 2008/2009 33
  • 34. Attenzione !!! • Ritornare un riferimento ad una variabile locale è un errore logico • E' anche un errore di gestione della memoria – Il compilatore può non segnalare l'errore – Se poi si assegnano valori tramite tali riferimenti si può corrompere la memoria del programma Programmazione I - Paolo Valente, 2008/2009 34
  • 35. Passaggio parametri per riferimento in C Come già detto, il passaggio per riferimento è disponibile in molti linguaggi di alto livello (C++, Pascal), ma non in tutti. In particolare, NON è disponibile in C, e quindi in C deve essere simulato tramite l’uso di puntatori Programmazione I - Paolo Valente, 2008/2009 35