Oppure

Loading
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.
A cura di: Il Totem