L1 Lezione3 Parametri :’interfaccia tra la procedura chiamante e quella chiamata



Scaricare 73 Kb.
14.11.2018
Dimensione del file73 Kb.


L1 Lezione3


Parametri :’interfaccia tra la procedura chiamante e quella chiamata

  • Parametri: mezzo di comunicazione esplicita dell’ informazione fra l’unità di esecuzione chiamante e la procedura chiamata. Domanda:qual è la differenza fra i parametri e i”data Object” globali?

  • 3 categorie di parametri: In,Out, IN OUT.



Ovvio significato dei parametri

  • In: contengono l’ informazione che l’ unità di esecuzione chiamante passa alla procedura nel momento della chiamata: solitamente passati per valore.

  • Out : Informazione dalla procedura chiamata alla chiamante nel momento in cui avviene il ritorno del controllo alla chiamante.

  • In Out: che hanno funzioni sia dell’ IN che dell’ Out

  • Out e In Out sono solitamente passati per indirizzo : cioè i parametri attuali sono il nome del data object in cui va messo l’ eventuale valore di ritorno.



Ancora sui parametri

  • I parametri devono essere specificati sia nell’unità che chiama la procedura (statement di chiamata) sia nella definizione della procedura chiamata.

  • I Parametri nell’unità che chiama si chiamano parametri reali (attuali), nella procedura chiamata si chiamano parametri formali. I parametri attuali e i parametri formali corrispondenti devono essere dello stesso tipo nei linguaggi fortemente tipati.



Legame parametri con il tipo

  • REGOLA: avviene a compile time.

  • Eccezioni:

  • - I parametri formali vengono legati al tipo a run-time quando la procedura è chiamata. Questo naturalmente non permette un controllo dei tipi a compile time.

  • - I parametri formali vengono legati a run-time con sottotipi di qualche tipo di base a cui si è legato il parametro a tempo di compilazione.

  • Quest’ultima alternativa ovviamente permette il controllo dei tipi a compile-time.



Associazione:Parametri attuali con parametri formali

  • − per posizione: a seconda della posizione relativa nella sequenza dei parametri;

  • − per nome: il nome del parametro formale è aggiunto come prefisso al parametro attuale;



Esempio di Associazione

  • Esempio: supponiamo l’intestazione della seguente procedura (ADA):

  • procedure TEST (A: in Atype; b: in out Btype; C: out Ctype) invocazione con associazione per posizione :

  • TEST(X, Y, Z);

  • Invocazione con associazione per nome:

  • TEST(A=>X, C=>Z, b=>Y);

  • Una ulteriore tecnica `e la cosiddetta associazione di default. Essa permette di specificare valori di default ai parametri formali che non sono statilegati a valori da parametri attuali (valida ovviamente solo per parametri In)



Implementazione dei Parametri

  • Tutti i tipi di parametri possono essere implementati per indirizzo o per copia : Per capire al volo le diapositive seguenti ricordate che gli IN contengono informazione mandata, per essere usata, dalla procedura chiamante, gli OUT devono riportare alla chiamante i risultati della computazione che si è svolta nella procedura chiamata



Parametri IN implementati per indirizzo

  • il parametro IN è trattato come una costante con nome:

  • il compilatore controllerà che il parametro formale non sia modificato dalla procedura:

  • non appaia nella parte sinistra di uno statement di assegnazione ,

  • non sia usato, nella procedura, come parametro reale di OUT o di IN OUT in uno statement di chiamata di un’ altra procedura ……....



Parametri IN implementati per copia

  • Il parametro attuale è trattato come valore di una variabile locale alla procedura chiamata (il cui nome è il nome del parametro formale). Può essere modificato durante l’esecuzione della procedura e la sua modifica non ha chiaramente effetti sul parametro reale .

  • Il Pascal usa per default questa implementazione



Parametri OUT implementati per indirizzo

  • Per distinguerli dai parametri IN OUT, spesso i compilatori, quando sono passati per indirizzo, permettono l’accesso solo per modificarne il valore e non per usarlo: parametri OUT sempre alla sinistra degli eventuali statement di assegnazione! Nell’implementazione per copia, il parametro formale è usato come una variabile locale il cui valore iniziale è indefinito. Al termine della procedura il suo valore è passato al parametro reale.



Parametri OUT implementati per copia

  • Nell’implementazione per copia, il parametro formale è usato come una variabile locale il cui valore iniziale è indefinito. Al termine della procedura il suo valore è passato al parametro reale



Parametri IN OUT implementati per indirizzo

  • Non ci sono restrizioni del parametro formale dentro la procedura.

  • In Pascal questo è il modello usato per i parametri VAR.



Parametri IN OUT implementati per copia

  • Ritroviamo tutto quello che abbiamo nelle implementazioni per copia degli IN e degli OUT: Si crea una variabile locale per il parametro formale e il parametro reale viene copiato nella variabile locale. Quando la procedura termina, il valore finale del parametro formale viene copiato nella locazione del parametro reale.

  • L’implementazione IN OUT per copia è comunemente chiamato: value-result parameter passing.



Ancora IN OUT

  • Nel caso degli IN-OUT l’unica differenza nel passaggio per copia o per indirizzo è che nel secondo caso il parametro reale è modificato ogni volta che il parametro formale è modificato; nel primo caso, gli effetti delle modifiche si hanno solo alla fine della procedura



ALIASING

  • Aliasing è la possibilità di riferirsi con nomi differenti alla stessa locazione.

  • Esempio:

  • program main;

  • var A : integer;

  • procedure test ( var X, Y : integer );

  • begin

  • X : = A + Y;

  • writeln (A, X, Y);

  • end;

  • begin

  • A : = 1;

  • Test (A,A);

  • end



Discussione esempio aliasing

  • L’invocazione Test (A, A) produce che A, Y e X sono legati alla stessa locazione producendo aliasing.

  • L’aliasing diminuisce molto la comprensibilità della procedura e forza il programmatore a dipendere a livelli profondi dall’implementazione del linguaggio.

  • Per esempio nell’implementazione del Pascal dei parametri definiti VAR, il programma scriverà 2 2 2;

  • Se (cosa che non è) i VAR fossero implementati per copia, il risultato del writeln sarà 1 2 1. Cosa che uno si aspetta. Ma anche in questo caso al termine di TEST la locazione identificata da A, potrà contenere 1 o 2, in dipendenza dall’ordine in cui i parametri formali saranno scritti in A



Riassumendo: Aliasing avviene quando

  • a) variabili non locali e parametri formali implementati per indirizzo condividono lo stesso indirizzo

  • b) quando due parametri reali condividono la stessa locazione.

  • c) quando c’è il trasferimento di valori in locazioni diverse.

  • In ogni caso anche quando i parametri sono implementati per copia, può ancora verificarsi ambiguità quando due OUT o IN OUT parametri reali si riferiscono alla stessa entità dato.



Definizione di funzioni o “VRP: value-returning-procedure”

  • Esempio di definizione in Pascal e in Modula 2:

  • In Pascal

  • function F (X: Xtype; Y: Ytype) : Result type;

  • In Modula 2

  • procedure F (X: Xtype ; Y: Ytype) : Result type;



Funzioni: esecuzione.

  • Sono procedure che restituiscono un valore alla unità chiamante: esse quindi hanno bisogno, in aggiunta a tutto quello che riguarda le procedure, di aver definito il tipo del valore che ritornano.

  • Sono realizzate

  • • o creando, senza previa definizione, nell’ambiente locale della procedura chiamata, una pseudovariabile legata al nome della VRP, a cui si può accedere solo per modifiche (per es. deve apparire solo alla sinistra di uno statement di assegnazione).Il cui valore viene ritornato all’ unità chiamante quando finisce l’ esecuzione della VPR.

  • • o utilizzando uno statement di ritorno,contenente Return seguito da un’ espressione, per restituire esplicitamente il controllo alla procedura chiamante inviandole allo stesso tempo il valore dell’espressione sopracitata.

  • Nota che: tutti i tipi di parametri che pure si possono implementare possono avere effetti indesiderabili in quanto l’ espressione che astrae la VRP non dovrebbe cambiare implicitamente nessun valore dell’ ambiente in cui viene invocata.



Overloading

  • E’ permessa la definizione di due procedure (funzioni) con lo stesso nome a patto che il numero di parametri e/o il tipo di essi (nel caso di funzione e/o il tipo del valore di ritorno) siano diversi .



Esempio di overloading in ADA

  • procedure MAIN is

  • R: FLOAT:= 0.0;

  • I: INTEGER:= 0;

  • function F(X: FLOAT) return INTEGER is

  • begin

  • return 1;

  • end;

  • function F(X: INTEGER) return INTEGER is

  • begin

  • return 2;

  • end;

  • function F(X: FLOAT; Y: INTEGER) return INTEGER is

  • begin

  • return 3;

  • end;



Segue Esempio di overloading in Ada

  • function F(X: INTEGER; Y: FLOAT) return INTEGER is

  • begin

  • return 4;

  • end;

  • function F(X: INTEGER) return FLOAT is

  • begin

  • return 5.0;

  • end;

  • begin

  • put (F(R)); -- Stampa 1

  • put (F(I)); -- Stampa 2

  • put (F(R,I)); -- Stampa 3

  • put (F(I,R)); -- Stampa 4

  • R:= F(I);

  • put (Integer(R)); -- Stampa 5

  • end MAIN;



Riassunto Astrazione Procedurale

  • Nell’astrazione procedurale abbiamo visto due importanti proprietà:

  • INCAPSULAMENTO e PARAMETRIZZAZIONE

  • Incapsulamento: è la proprietà di nascondere i dettagli dell’ implementazione di una procedura p e quindi anche dell’ ambiente locale, all’unità di esecuzione che usa p, ovvero è la possibilità di isolare l’implementazione di p dall’ambiente in cui viene usato.

  • Parametrizzazione: è la proprietà mediante la quale una procedura può effettuare attività diverse al variare dei ‘valori’ dei suoi parametri.

  • Per esempio “ordinamento su array”, può ordinare ogni array di ogni grandezza purché corrisponda alla definizione dei parametri



Esercizi

  • ESERCIZIParadigmaImperativoProcedure.doc





Condividi con i tuoi amici:


©astratto.info 2019
invia messaggio

    Pagina principale