1
6. PARAMETRIZACIÓN
2
Parametrización
La parametrización permite realizar una abstracción de la identidad de varios ejemplos de los datos
Los valores reales de los datos NO son importantes.
Interesa la cantidad y tipo de datos de ellos.
Los parámetros están asociados a los procedimientos
Especifican la forma de los objetos de datos con los cuales se trabajará.
3
Parametrización
Cada uno de los elementos que participan en la representación de una variable:
es susceptible de ser parametrizado
Nombre Tipo Referencia Valor
La parametrización del tipo establece una diferencia conceptual importante en la categorización de los lenguajes.
4
Parametrización
1. Parametrización de datos
2. Parametrización de tipos
3. Parametrización de subprogramas
Nombre
Referencia
Valor
Tipo
5
Parametrización de Datos
6
Opciones de Llamada
Por Nombre
Por Referencia
Por Copia
Por Valor
Por Resultado
Por Valor-Resultado
Por Indirección
7
Subprogramas de ejemplo
Procedure Uno(<Modalidad> a, b :
integer);Begin
a := 7;b := 5;
End;Procedure Cero;Var c, d : integer;Begin
c:= 5;d := 7;Uno(c, d);Write(c, d);
End;
8
Parametrización por Nombre
<Modalidad>::= Name
9
Llamada por nombre (Algol)
La llamada al SP
realiza
en TODO el cuerpo del subprograma
una sustitución
parámetro formal
Permite modificar los parámetros actuales
argumento o parámetro actual
(Llamada)
10
Procedure Uno(Name a, b :
integer);Begin
a := 7;b := 5;
End;
Procedure Cero;Var c, d : integer;Begin
c:= 5;d := 7;Uno(c, d);Write(c,
d);End;
Llamada por nombre
c 5
d 7
a
b
a bUno:
7 55 7
c dCero: c :=
7;b := 5
Regla de sustitución en
UNO
7 y 5
sustitución
sustitución
11
Ejemplo
Procedure Uno;Var
x: integer;
Procedure Dos(name y: Integer);Var
x: Integer;Begin
x:=2;Write(y);
End;Begin
x:=1;Dos(x);
End;
Dos(x);La llamada:
x=2;Write(x);
Regla de sustitución
1 2
Uno: xDos: y x
1
x 2
x 1 y
c 4
Ejemplo Situación poco clara:Procedure Dos;Var
c: integer;
Procedure swap(name a,b: Integer);Var
temp: Integer;Begin
temp:=a;a:=b;b:=temp:c:=c+1;
End;Procedure Tres;Var
c,d: Integer; Begin
c:=5;d:=7;Swap(c,d);Write(c,d);
End;Begin
c:=4;Tres;
End;
temp:=c;c:=d;d:=temp;c:=c+1;
Regla de sustitución en Swap
4 5 7 5
Dos: cTres: c d
Swap: a b temp
5 7 5
a
b
7,5
c 5
d 7
temp 5
7
5
5
13
Gráficamente
Dos:c: 4
Swapabtemp: 5
c:5d:7temp: 5
Tres75
5
7,5
14
Efectos inesperados
Procedure Swap(name a, b : integer);var
temp : integer;begin
temp := a;a := b;b := temp;
end;
swap(i, vi);
La llamada:
temp := i;i:= v[i];v[i] := temp
Regla de sustitución
Si antes de la llamada:
i = 3 y v[3] = 5
i = 5 y v[5] = 3
Pero queda:
1 2 3 4 5 6 7
4 6 5 2 7 1 3
i=3
1 2 3 4 5 6 7
4 6 5 2 3 1 3
i=5
?
1 2 3 4 5 6 7
4 6 3 2 7 1 3
i=5
15
Parametrización Por Referencia
<Modalidad>::= Ref
16
Llamada por Referencia (Fortran)
Al SP se entrega el l-valor del ODD
El ODD no cambia su posición en la
RAM
argumento o parámetro actual
(Llamada)
Permite modificar los parámetros actuales
parámetro formal
Transferencia de la dirección
Parámetro Actual
Parámetro Formal
l-valor
17
5 7
c dCero:
Procedure Uno(ref a, b :
integer);Begin
a := 7;b := 5;
End;
Procedure Cero;Var c, d : integer;Begin
c:= 5;d := 7;Uno(c, d);Write(c,
d);End;
Llamada por Referencia
a bUno:
7 y 5
7 5 c 5
d 7
a
b
18
Parametrización por Copia
Por Valor
Por Resultado
Por Valor-Resultado
19
Llamada por Copia
Los parámetros actuales se relacionan con los parámetros formales por medio de:
Asignación de valores
El parámetro actual entrega su r-valor al parámetro formal, el que es copiado en OTRA localidad.
Parámetro Actual
Parámetro Formal
r-valor
20
Llamada por Valor
Los VALORES de los parámetros actuales se utilizan para inicializar los respectivos parámetros formales
Al efectuarse una invocación se realizan las asignaciones de los VALORES a los
parámetros formales
<Modalidad>::= in
21
Ejemplo
c 5
d 7
Procedure Uno(in a, b : integer);Begin
a := 7;b := 5;
End;
Procedure Cero;Var c, d : integer;Begin
c:= 5;d := 7;Uno(c, d);Write(c,
d);End;
5 7
a bUno:
a 5
b 7
5 7
c dCero:
Asignación en la llamada:
a:= c;b:= d;
5 y 7
7 5
7
5
22
Llamada por Resultado
Los parámetros formales NO se inicializan al invocarse el subprograma
Al terminar la ejecución del subprograma, los valores de los parámetros formales, son
asignados a los respectivos parámetros actuales usados en la llamada.
<Modalidad>::= out
23
a
b
Ejemplo
c 5
d 7
Procedure Uno(out a, b :
integer);Begin
a := 7;b := 5;
End;
Procedure Cero;Var c, d : integer;Begin
c:= 5;d := 7;Uno(c, d);Write(c,
d);End;
7 5
a bUno:
5 7
c dCero:
Asignación al final de la ejecución:
c:= a;d:= b;
7 y 5
7
5
7 5
7
5
24
Llamada por Valor-Resultado
Se trata de un efecto combinado.
b) Al terminar la ejecución del subprograma, los valores de los parámetros formales, son asignados a los respectivos parámetros actuales usados en la llamada.
<Modalidad>::= in-out
a) Al efectuarse una invocación se realizan las asignaciones de los VALORES a los parámetros formales
25
Ejemplo
c 5
d 7
Procedure Uno(in-out a, b :
integer);Begin
a := 7;b := 5;
End;
Procedure Cero;Var c, d : integer;Begin
c:= 5;
d := 7;Uno(c, d);Write(c, d);
End;a bUno:
5 7
c dCero:
7 y 5
7 5
7
5 5 7
a 5
b 7 7 5
7
5
a:= c;b:= d;
Al llamar: c:= a;d:= b;
Al terminar:
26
Parametrización por Indirección
27
Llamada por Indirección
Es una llamada por valor en la cual el parámetro formal recibe la dirección de la variable utilizada como parámetro actual.
<Modalidad>::= in
En la definición anteponer el operador de indirección al parámetro formal : * (en C)
En la llamada anteponer el operador de dirección al parámetro actual : & (en C)
28
Ejemplo
c 100 5
d 300 7
Procedure Uno(in *a, *b : integer);Begin
*a := 7;*b := 5;
End;
Procedure Cero;Var c, d : integer;Begin
c:= 5;
d := 7;Uno(&c, &d);Write(c, d);
End;a bUno:
5 7
c dCero:
7 y 5
100 300
l-valor de c a;l-valor de d b;
Al llamar:
a 100
b 300 7 5
7
5
29
Resumen
Aunque la implementación es diferente, las siguientes modalidades generan el mismo efecto:
Por nombrePor referenciaPor resultadoPor valor-resultadoPor indirección
30
Parametrización de Tipos
31
Problema
Se cuenta con una rutina que suma los elementos de un vector de n=100 enteros
int Suma(Vector v,int n){int i, s=0; for (i=0;i<n;i++) s=s+v[i]; return s;}
¿Será posible utilizarla para sumar:
a) Los elementos enteros de un vector A[0..50]?
b) Los elementos enteros de un vector B[0..300]?
c) Los elementos reales de un vector C[0..100]?
32
Análisis
El problema radica en que, en los lenguajes fuertemente tipados, esta asociado el tipo de dato a los operadores.
int Suma(Vector v,int n){int i, s=0; for (i=0;i<n;i++) s=s+v[i]; return s;}
La declarativa y verificación de tipos, restringe el tipo de dato "Vector" (según el ejemplo) que la rutina puede recibir.
33
Solución
Algunos lenguajes han desarrollado la facilidad de poder pasar como parámetro el tipo de dato de los ODD.
Así será posible tener unidades más genéricas. Es decir, unidades que no sólo reciban variables, valores o direcciones como parámetro, sino que también reciban el tipo de dato.
34
Solución
La parametrización de tipos involucra un alto nivel de abstracción y disminuye el tamaño del código fuente
La producción de distintos subprogramas, que difieran sólo en el tipo de dato de sus argumentos, se realiza en tiempo de traducción.
Se generan tantos subprogramas como tipos de datos se hayan indicado en el programa.
35
Alternativas
ADA: Unidades Genéricas
C++: Plantillas de funciones
36
Unidades Genéricas
El concepto de UNIDAD GENÉRICA Se utiliza para definir la parametrización de tipo.
Una unidad genérica es una unidad formal (modelo) cuyos parámetros son instalados en tiempo de traducción produciéndose una unidad actual.
Definición
37
Unidades Genéricas
La parametrización de tipos se implementa mediante
macro-expansión
Implementación
el concepto de
38
Unidades Genéricas
Sea el siguiente subprograma genérico en lenguaje Ada
generic type T;procedure Swap(X, Y : in out T) is
Temp : T;begin
Temp:= X;X := Y;Y := Temp;
end;
En este caso, el tipo de dato de X e Y es el parámetro que debe ser sustituido en tiempo de traducción.
T: es el tipo de dato genérico
39
Unidades Genéricas
La producción de distintos subprogramas, que difieran sólo en el tipo de sus argumentos, se puede lograr, por ejemplo, mediante:
procedure Swapinteger is new Swap (integer);
procedure Swapreal is new Swap (real);
Generará dos subprogramas equivalentes.
40
Ejemplo
El código:
logical mas(logical in a, logical in b)
{ mas := a + b; }
permite obtener el resultado de la suma (or) de dos valores de tipo logical.
a) Agregar y/o modificar el código necesario para que la unidad "mas" permita, además, sumar valores de tipos integer, rational y real.
b) Citar el concepto utilizado en la parte anterior y, además, las formalidades de definición e implementación en modalidad Ada
41
Solución del ejemplo
generic type T
T Mas(T in a, T in b)
{ mas := a + b; }
b) Concepto: Parametrización de tipos.
Definición: Unidades genéricas.
Implementación: como macro-expansión
procedure Maslogical is new Mas (logical);
procedure Masinteger is new Mas (integer);
procedure Masreal is new Mas (real);
procedure Masrational is new Mas (rational);
a)
42
Plantillas de funciones
Se escribe una definición de plantilla de función
tantos códigos objeto de función como llamadas con diferentes tipos de argumentos existan.
Para que el compilador genere, en forma
automática,
43
Plantillas de funciones
void main()
{ int a[4] = {1, 2, 3, 4};
float b[6] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6};
char c[5] = "Hola";
cout << "El arreglo A contiene: ";
Imprimir(a, 4);
cout << "El arreglo B contiene: ";
Imprimir(b,6);
cout << "El arreglo C contiene: ";
Imprimir(c, 5);
}
template <class T>
void Imprimir(T *V, int k)
{for(int i = 0; i < k; i++)
cout<< V[i] << " ";
cout<< endl;
}
44
Parametrización de Subprogramas
45
Subprogramas como parámetros
El envío de un subprograma como parámetro
Una referencia al segmento de código del parámetro actual y
La información respecto del entorno no local de ese parámetro.
requiere pasar
46
Subprogramas como parámetros
Un subprograma parámetro
se puede representar como un par ordenado (c,
r)
donde c es un puntero al segmento de código y r un puntero al registro de activación de la unidad que
contiene la definición del subprograma
47
Ejemplo
Procedure P... ··· Procedure A...
···
Begin ··· End; Procedure B(procedure X); var y: integer; Procedure C... ··· Begin ··· End; Begin X; B(C); ··· End; Begin ··· B(A); ··· End
Como B tiene definido un parámetro formal X, la llamada a X activa el procedimiento A.
1. P llama a B con el procedimiento A como parámetro actual
Una segunda invocación a X activará el procedimiento C
2. B se autoinvoca con el procedimiento C como parámetro actual
48
Ejemplo
int Tres(int k)
{ return(k); }
int Dos(int Y, int j)
{ return(j + Y); }
int Uno(int X, int i)
{ return(i + X); }
void Main()
{ display(Uno(Dos(Tres(3),2),1)); }
a) Mostrar claramente la secuencia de invocaciones mediante el stack del registros de activación e indicar el valor desplegado en Main.
b) Citar y explicar claramente el concepto que más se destaca en este código.
Con respecto a la ejecución del siguiente código:
49
Dos:Y: Tres(3)j : 2 2+ ___
Solución
int Tres(int k)
{ return(k); }
int Dos(int Y, int j)
{ return(j + Y); }
int Uno(int X, int i)
{ return(i + X); }
void Main()
{ display(Uno(Dos(Tres(3),2),1)); }
display(Uno(Dos(Tres(3),2,1)Main: 6
Uno:X: Dos(Tres(3),2)i : 1
1+ ___5 = 6
Stack de RA
k: 3Tres: 3
3 = 5
50
Ejemplo
Function F: Integer;Var k: Integer;Begin
Readln(k);If (k<>-1) then
F:= k+Felse
F:= 0;End;
Si se invoca x:= F;
Determinar la cantidad de veces que se ejecutó la sentencia Readln(k) si la memoria utilizada por el stack es de 60B.
Con respecto a la ejecución del siguiente código:
51
Solución
Tamaño del Stack de RA = Cantidad de RA * Tamaño del RA
La cantidad de veces que se ejecutó la sentencia Readln(k) es igual al N° de activaciones (o llamadas) de la función.
El N° de activaciones = Cantidad de RA
RAdelTamañostackdelTamaño
RAdeCantidad
52
Solución
Tamaño del Stack de RA = 60 B
Tamaño del RA
Variables locales: k : 2B (Integer)Valor de retorno : 2B (Integer)Dirección de retorno: 4B (LongInt)
51260 RA#
Enlace Dinámico : 4B (LongInt)
12 B