PDA

View Full Version : [pascal] Passare dei dati alle procedure.


das
21-10-2007, 22:07
Ho una procedura che deve generare una serie di risultati, facciamo ad esempio i numeri tra due intervalli::

procedure tform.numeri(min,max:integer);
var a;
begin
a:=min;
while a <> max do
begin
a:=a+1
end;
end;

Come faccio a fare in modo che senza usare un array globale, la procedura chiamante abbia i risulati ?

Non posso usare un array o un puntatore dichiarato globalmente perchè quando le procedure sono tante e complesse, diventa molto problematico riusarle in altri programmi facendo un semplice copia/incolla.


Esiste un modo ?

Grazie

das
22-10-2007, 09:53
Mi è venuta un 'idea ma non so se è la soluzione diciamo così 'ufficiale'.

Nella procedura chiamante costruisco un puntatore e lo passo alla funzione chiamata.
Questa modifica i dati puntati o ne crea di nuovi e poi ritorna.
La procedura chiamante dispone ora dei risulati, li usa e poi distrugge il puntatore.

A questo punto la memoria si è effettivamente liberata oppure no ?
E' lecito passare ad una funzione un puntatore ?

das
22-10-2007, 16:00
Nel caso servisse mai a qualcuno, ci sono riuscito.





type
pQueue = ^tqueue;
tQueue = record
data: integer;
next: pQueue;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var ddd: pQueue;
a:integer;
i: pointer;
begin
i:=Calcola();
new(ddd);
ddd:=i;
a:=0;
while ddd^.next <> nil do
begin
memo1.Text:=memo1.Text+inttostr(ddd^.data)+' ';
ddd:=ddd^.next;
end;
dispose(ddd);
end;

function TForm1.Calcola(): pointer;
var dde,ddc: pQueue;
a:integer;
b: pointer;
begin
new(dde);
b:=dde;
for a:= 1 to 10 do
begin
dde^.data:=a;
new(ddc);
dde^.next:=ddc;
dde:=ddc;
end;
dde^.next:=nil;
result:= b;
end;


Occhio che poi vanno distrutti tutti i puntatori creati.