|
I tipi procedurali sono i più complessi di tutto il Pascal. In sostanza, come esistono tipi derivati che fanno riferimento ad interi, numeri reali o stringhe, esistono anche tipi che fanno riferimento a procedure o funzioni: i tipi procedurali.
Come accade per gli altri tipi, una variabile di tipo procedurale deve contenere lo stesso numero di parametri specificato nel tipo e deve restituire lo stesso valore specificato nel tipo:
(*...*)
type
proc=procedure(var x,y:integer);
procedure scambia(var a,b:integer);
var temp:integer;
begin
temp:=a;
a:=b;
b:=temp;
end;
procedure scambiadoppio(var z,w:integer);
var temp:integer;
begin
temp:=2*z;
z:=2*w;
w:=temp;
end;
var e:proc;
m,n:integer;
begin
clrscr;
e:=scambia;
m:=2;
n:=5;
writeln('m=',m,' n=',n);
e(m,n);
writeln('m=',m,' n=',n);
e:=scambiadoppio;
e(m,n);
writeln('m=',m,' n=',n);
readln
end;
L'output è:
m=2 n=5
m=5 n=2
m=4 n=10
Prima le due variabili vengono scambiate, poi scambiate ancora e moliplicate per 2.
Come si è visto la variabile e contiene una procedure intera ed è chiamata per scambiare m ed n.
Altri esempi:
type
porc:procedure(x:integer);
func:function(m:integer):integer;
procedure ch(var f:integer);
begin
f:=f*2;
end;
function gh(f:integer):integer;
begin
gh:=5*f;
end;
function sm(d,f:integer):integer;
begin
sm:=d+f;
end;
var a:proc;
b:func;
begin
a:=ch; (*giusto*)
b:=gh; (*giusto*)
b:=sm; (*sbagliato: sm ha 2 parametri);
if b(2)=b(3) then (*compara i risultati*)
(*...*)
if @b=@a then (*compara il corpo della funzione*)
(*...*)
end.
|
|