1 of 76

Lenguajes de Programación I

TP5 - Pasaje de Parámetros

Ejercicio 4

2 of 76

  1. Construya las pilas de registros de activación para cada semántica de pasaje de parámetros. Considere que el pasaje por referencia se implementa mediante alias, y nombre mediante reemplazo textual.
  2. Ordene en forma ascendente las semánticas de pasaje de parámetros de acuerdo al tiempo que transcurre desde que comienza el programa hasta que se realiza la primera modificación de la variable i (sin tener en cuenta como modificación la inicialización de la misma por la instrucción [2]).
  3. Verdadero/falso: observar para éstos qué elemento del arreglo se modifica con cada PP

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

Dado el siguiente programa en un lenguaje tipo Algol:

3 of 76

Copia Valor

¿Cómo se comporta?

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

4 of 76

EXE

RA main

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

CD

CE

Copia Valor

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

5 of 76

EXE

RA main

CD

CE

Copia Valor

RA ZZ

y: 1 z: 1

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

6 of 76

EXE

RA main

CD

CE

Copia Valor

RA ZZ

y: 12 z: 13

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

7 of 76

EXE

RA main

CD

CE

Copia Valor

RA ZZ

y: 12 z: 13

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 1 z: 1

RA ZZ(2)

8 of 76

EXE

RA main

CD

CE

Copia Valor

RA ZZ

y: 12 z: 13

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 12 z: 13

RA ZZ(2)

9 of 76

EXE

RA main

CD

CE

Copia Valor

RA ZZ

y: 12 z: 13

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 12 z: 13

RA ZZ(2)

1

2

3

1

2

3

a:

PCV no modifica el arreglo, trabaja sobre parámetros formales

10 of 76

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

Copia Resultado

¿Cómo se comporta?

11 of 76

EXE

RA main

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

CD

CE

Copia Resultado

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

12 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ? z: ?

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: i, z: a[1]

13 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: i, z: a[1]

14 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

a[1]: 13 a[2]: 2 a[3]: 3

x: 123 i:12

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: i, z: a[1]

15 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: ? z: ?

RA ZZ(2)

a[1]: 13 a[2]: 2 a[3]: 3

x: 123 i:12

y: i, z: a[1]

y: i, z: a[2]

16 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: ?3 z: ?4

RA ZZ(2)

a[1]: 13 a[2]: 2 a[3]: 3

x: 123 i:12

y: i, z: a[1]

y: i, z: a[2]

17 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: ?3 z: ?4

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

y: i, z: a[1]

y: i, z: a[2]

18 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: ?3 z: ?4

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

y: i, z: a[1]

y: i, z: a[2]

3

4

3

1

2

3

a:

PCR modifica el arreglo, actualiza parámetros reales a la vuelta del llamado

19 of 76

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

Copia Valor-Resultado

¿Cómo se comporta?

20 of 76

EXE

RA main

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

CD

CE

Copia Valor-Resultado

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

21 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 1 z: 1

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: i, z: a[1]

22 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: i, z: a[1]

23 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

a[1]: 13 a[2]: 2 a[3]: 3

x: 123 i:12

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: i, z: a[1]

24 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 2 z: 2

RA ZZ(2)

a[1]: 13 a[2]: 2 a[3]: 3

x: 123 i:12

y: i, z: a[1]

y: i, z: a[2]

25 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 23 z: 24

RA ZZ(2)

a[1]: 13 a[2]: 2 a[3]: 3

x: 123 i:12

y: i, z: a[1]

y: i, z: a[2]

26 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 23 z: 24

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

y: i, z: a[1]

y: i, z: a[2]

27 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 23 z: 24

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

y: i, z: a[1]

y: i, z: a[2]

3

4

3

1

2

3

a:

PCVR modifica el arreglo, actualiza parámetros reales a la vuelta del llamado

28 of 76

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

Referencia

¿Cómo se comporta?

29 of 76

EXE

RA main

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

CD

CE

Referencia

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

30 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

31 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:12

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

32 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

a[1]: 14 a[2]: 2 a[3]: 3

x: 123 i:12

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

33 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 14 a[2]: 2 a[3]: 3

x: 123 i:12

y: (i) z: (a[2])

34 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 14 a[2]: 2 a[3]: 3

x: 123 i:123

y: (i) z: (a[2])

35 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 14 a[2]: 25 a[3]: 3

x: 123 i:123

y: (i) z: (a[2])

36 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 14 a[2]: 25 a[3]: 3

x: 123 i:123

y: (i) z: (a[2])

4

5

3

1

2

3

a:

PR modifica el arreglo, trabaja sobre los parámetros reales (alias)

37 of 76

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

Nombre

¿Cómo se comporta?

38 of 76

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

Nombre

¿Cómo se comporta?

39 of 76

EXE

RA main

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

CD

CE

Nombre

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

40 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:1

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

41 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

a[1]: 1 a[2]: 2 a[3]: 3

x: 123 i:12

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

42 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

a[1]: 1 a[2]: 24 a[3]: 3

x: 123 i:12

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

43 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 1 a[2]: 24 a[3]: 3

x: 123 i:12

44 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 1 a[2]: 24 a[3]: 3

x: 123 i:123

45 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 1 a[2]: 24 a[3]: 35

x: 123 i:123

46 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 1 a[2]: 24 a[3]: 35

x: 123 i:123

1

4

5

1

2

3

a:

PN modifica el arreglo, trabaja sobre los parámetros reales reemplazando a los formales en la unidad llamada

47 of 76

  1. Ordene en forma ascendente las semánticas de pasaje de parámetros de acuerdo al tiempo que transcurre desde que comienza el programa hasta que se realiza la primer modificación de la variable i (sin tener en cuenta como modificación la inicialización de la misma por la instrucción [2]).

variable i parámetro real lo modifican PR, PN, PCR, PCVR

48 of 76

EXE

RA main

CD

CE

Nombre

RA ZZ

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

yi:=i+1;

za[i]:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 1 a[2]: 24 a[3]: 35

x: 123 i:123

1

4

5

1

2

3

a:

PN la modifica dentro del llamado, antes de volver al llamador

49 of 76

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

RA ZZ(2)

a[1]: 14 a[2]: 25 a[3]: 3

x: 123 i:123

y: (i) z: (a[2])

4

5

3

1

2

3

a:

PR la modifica dentro del llamado, antes de volver al llamador

50 of 76

  • Ordene en forma ascendente las semánticas de pasaje de parámetros de acuerdo al tiempo que transcurre desde que comienza el programa hasta que se realiza la primer modificación de la variable i (sin tener en cuenta como modificación la inicialización de la misma por la instrucción [2]).

Referencia

Nombre

51 of 76

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: ?3 z: ?4

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

3

4

3

1

2

3

a:

PCR la modifica después del llamado, al volver al llamador y desapilar ZZ

52 of 76

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do

a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

y: 23 z: 24

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

3

4

3

1

2

3

a:

PCVR la modifica después del llamado, al volver al llamador y desapilar ZZ

53 of 76

  • Ordene en forma ascendente las semánticas de pasaje de parámetros de acuerdo al tiempo que transcurre desde que comienza el programa hasta que se realiza la primer modificación de la variable i (sin tener en cuenta como modificación la inicialización de la misma por la instrucción [2]).

Referencia

Nombre

Copia resultado

Copia valor-resultado

  1. PR, PN
  2. PCR, PCVR

(PCV no lo modifica)

54 of 76

Analizar si las siguientes afirmaciones son verdaderos o falsas:

  1. La instrucción [1] produce la modificación del mismo elemento del arreglo todas las veces que se ejecuta (considerar todos los tipos de pasaje de parámetros).

program MAIN;

x,i: integer;

a: array[1..3] of integer;

procedure ZZ(int y,int z);

begin

y:=i+1;

z:=a[i]+2; [1]

end;

begin

for x:=1 to 3 do a[x]:=x;

i:=1; [2]

ZZ(i,a[i]);

ZZ(i,a[i]);

end

55 of 76

  • La instrucción [1] produce la modificación del mismo elemento del arreglo todas las veces que se ejecuta (considerar todos los tipos de pasaje de parámetros).

Falso. Se modifican dos elementos distintos:

  • Referencia, copia resultado y copia valor-resultado: se modifica a[1] y a[2]
  • Nombre: se modifica a[2] y a[3]
  • Copia valor: no modifica el arreglo

3

4

3

1

2

3

CR

CV

CVR

R

N

1

4

5

1

2

3

4

5

3

1

2

3

1

2

3

1

2

3

3

4

3

1

2

3

56 of 76

b) Tanto para los pasajes por copia resultado como por copia valor resultado, el registro de activación de ZZ tendrá el mismo tamaño y, durante toda la ejecución del procedimiento, los valores de las variables contenidas en ZZ serán los mismos para ambas semánticas.

57 of 76

b) Tanto para los pasajes por copia resultado como por copia valor resultado, el registro de activación de ZZ tendrá el mismo tamaño y, durante toda la ejecución del procedimiento, los valores de las variables contenidas en ZZ serán los mismos para ambas semánticas.

EXE

RA main

CD

CE

Copia Resultado

RA ZZ

y: ?2 z: ?3

y: ?3 z: ?4

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

EXE

RA main

CD

CE

Copia Valor-Resultado

RA ZZ

y: 12 z: 13

y: 23 z: 24

RA ZZ(2)

a[1]: 13 a[2]: 24 a[3]: 3

x: 123 i:123

58 of 76

b) Tanto para los pasajes por copia resultado como por copia valor resultado, el registro de activación de ZZ tendrá el mismo tamaño y, durante toda la ejecución del procedimiento, los valores de las variables contenidas en ZZ serán los mismos para ambas semánticas.

Falso. Si bien los registros de activación tienen el mismo tamaño, los valores iniciales de z e y son distintos (ya que en copia resultado no se copia el valor del parámetro real)

59 of 76

c) Si el pasaje de parámetros fuera por referencia, el llamado ZZ(3,i+a[i]) produciría un error de compilación de tipo sintáctico.

60 of 76

c) Si el pasaje de parámetros fuera por referencia, el llamado ZZ(3,i+a[i]) produciría un error de compilación de tipo sintáctico.

Falso. El error sería de tipo semántico.

61 of 76

d) Tanto en el pasaje de parámetros por referencia como por nombre, los valores finales del arreglo a serán iguales.

62 of 76

d) Tanto en el pasaje de parámetros por referencia como por nombre, los valores finales del arreglo a serán iguales.

EXE

RA main

CD

CE

Nombre

RA ZZ

RA ZZ(2)

a[1]: 1 a[2]: 24 a[3]: 35

x: 123 i:123

EXE

RA main

CD

CE

Referencia

RA ZZ

y: (i) z: (a[1])

RA ZZ(2)

a[1]: 14 a[2]: 25 a[3]: 3

x: 123 i:123

y: (i) z: (a[2])

63 of 76

d) Tanto en el pasaje de parámetros por referencia como por nombre, los valores finales del arreglo a serán iguales.

Falso. Por referencia los valores son :

y por nombre:

1

4

5

1

2

3

4

5

3

1

2

3

64 of 76

e) Si la variable i fuera definida como static i:integer, se produciría un error al pasarla por referencia.

¿Qué cambia en i al definirla como static?

65 of 76

e) Si la variable i fuera definida como static i:integer, se produciría un error al pasarla por referencia.

Falso. Cambiar el almacenamiento de la variable no produce ningún problema, ya que sigue siendo referenciable

66 of 76

f) Los parámetros reales deben estar al alcance de la unidad llamada.

67 of 76

f) Los parámetros reales deben estar al alcance de la unidad llamada.

¿Dónde están almacenados los parámetros reales?

  • En la unidad llamadora o en su ámbito global

68 of 76

f) Los parámetros reales deben estar al alcance de la unidad llamada.

Falso. Deben estar al alcance de la unidad llamadora.

69 of 76

f) Los parámetros reales deben estar al alcance de la unidad llamada.

¿Podría ser verdadero para alguna semántica?

Otro ejemplo:

proc A (){

int x=1;

B(x);

}

proc B (int y){

print y;

}

main(){

A();

}

70 of 76

f) Los parámetros reales deben estar al alcance de la unidad llamada.

proc A (){

int x=1;

B(x);

}

proc B (int y){

print y;

}

main(){

A();

}

proc A (){

int x=1;

B(x);

}

proc B (int y){

print x;

}

main(){

A();

}

No está al alcance

de B

¿Podría ser verdadero para alguna semántica?

Pasaje por nombre —->

71 of 76

g) Con ninguno de los pasajes de parámetros se modifica el último elemento del arreglo a.

72 of 76

g) Con ninguno de los pasajes de parámetros se modifica el último elemento del arreglo a.

EXE

RA main

CD

CE

Nombre

RA ZZ

RA ZZ(2)

a[1]: 1 a[2]: 24 a[3]: 35

x: 123 i:123

1

4

5

1

2

3

73 of 76

g) Con ninguno de los pasajes de parámetros se modifica el último elemento del arreglo a.

Falso. El último elemento del arreglo se modifica en el pasaje por nombre.

74 of 76

h) En el caso de pasaje de arreglos como parámetros por referencia o nombre, es posible que los parámetros reales estén almacenados por filas y los formales, por columnas.

75 of 76

h) En el caso de pasaje de arreglos como parámetros por referencia o nombre, es posible que los parámetros reales estén almacenados por filas y los formales, por columnas.

Falso. En estas semánticas los parámetros formales no están almacenados.

76 of 76

h) En el caso de pasaje de arreglos como parámetros por referencia o nombre, es posible que los parámetros reales estén almacenados por filas y los formales, por columnas.

¿Puede suceder ésto en copia?