Lenguajes de Programación I
TP5 - Pasaje de Parámetros
Ejercicio 4
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:
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
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
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
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
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)
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)
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
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?
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
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]
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]
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]
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]
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]
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]
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
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?
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
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]
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]
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]
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]
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]
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]
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
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?
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
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
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
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
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])
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])
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])
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)
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?
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?
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
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
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
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
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
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
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
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
variable i parámetro real lo modifican PR, PN, PCR, PCVR
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
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
Referencia
Nombre
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
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
Referencia
Nombre
Copia resultado
Copia valor-resultado
(PCV no lo modifica)
Analizar si las siguientes afirmaciones son verdaderos o falsas:
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
Falso. Se modifican dos elementos distintos:
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 |
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.
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
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)
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.
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.
d) Tanto en el pasaje de parámetros por referencia como por nombre, los valores finales del arreglo a serán iguales.
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])
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 |
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?
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
f) Los parámetros reales deben estar al alcance de la unidad llamada.
f) Los parámetros reales deben estar al alcance de la unidad llamada.
¿Dónde están almacenados los parámetros reales?
f) Los parámetros reales deben estar al alcance de la unidad llamada.
Falso. Deben estar al alcance de la unidad llamadora.
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();
}
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 —->
g) Con ninguno de los pasajes de parámetros se modifica el último elemento del arreglo a.
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 |
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.
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.
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.
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?