Newsgroup: it.comp.lang.pascal
Titolo: array (2) ?

Chiedo scusa per il messaggio confuso di qualche giorno fa.
Rifaccio la domanda con un esempio.
Ho questa procedura che copio da appunti di Pascal:
procedure merge(a,b:vett;i1,f1,i2,f2:integer;var v:vett;var k1,k2:integer)
var i,j,k:integer;
fine:boolean;
begin
i:=i1;j:=i2;k:=1;
fine:=(i>f1)or(j>f2);
while not fine do begin
                             if a[i]<=b[j] then begin
                                                        v[k]:=a[j];
                                                        inc(i);
                                                       end
                                                else begin
                                                         v[k]:=b[j];
                                                          inc(j);
                                                          end;
                            inc(k);
                            fine:=(i>f1)or(j>f2);
                            end;
if j>f2 then for j:=i to f1 do begin
                                             v[k]:=a[j];inc(k);
                                             end
          else for i:=j to f2 do begin
                                            v[k]:=b[i];inc(k);
                                            end;
k1:=1;
k2:=pred(k);
end;
chiederei per favore quale dichiarazione scrivere per il tipo vett.
Vorrei poter chiamare merge(v1,v2,1,7,1,8,v3,i3,f3)
in cui v1 e v2 sono i vettori costanti (1,2,3,4,5,6,7) e
(8,9,10,11,12,13,14,15)
e stampare v3 con stampavettore(v3,i3,f3)
in cui stampavettore fa un ciclo da i3 a f3 (da 1 a 15).
Grazie, Gianmaria.

 ha scritto nel messaggio
news:9qeqp3$pmq$1...@pinco.nettuno.it...


 ha scritto nel messaggio
news:9qeqp3$pmq$1...@pinco.nettuno.it...

sono riuscito a compilare perfettamente con TP7 questo
codice:
unit aunit;
interface
    procedure t(a:array of integer);
implementation
  procedure t;
  begin
  end;
end.
Quindi al posto di vett usa array of integer.
Nota Bene: al posto di passare i1 e i2, per passare l'indice
iniziale e finale di i, e così per gli altri array, puoi
usare le funzioni della unit System (quella delle funzioni
base, non ha bisogno di essere inserita in "uses") Low (i) e
High(i), che ritornano appunto quello che tu hai chiamato i1
e i2. Per v, il Pascal è un po' cassarioso (ma se usi FPC so
che dovresti poter creare array di dimensioni variabili), ma
potresti creare con un var v(senza tipo, come nei buffer di
BlockRead o BlockWrite), o v: pointer; dato che puoi
calcolare da programma la dimensione finale di v (sommando
quelle degli array di partenza e poi moltiplicando per la
dimensione di un integer, sizeof(integer) ), usi GetMem per
allocare spazio per il puntatore e poi scrivi nel buffer.
Dato che Tp non ha l'aritmetica dei puntatori, puoi andare a
leggere segmento e offset del puntatore con seg(p) e ofs(p)
(P:pointer di ogni tipo), incrementare l'offset di
sizeof(integer) e scrivere o tramite l'array mem (vedi
guida), o ricostruendo un puntarore con Ptr, che chiede il
segmento (lo stesso) e l'offset (quello incrementato),
castandolo a ^Integer e assegnandogli un valore.
Se vuoi usare l'aritmetica dei puntatori che Tp7, con lo
switch $X+, permette sui puntatori a carattere, usa un
puntatore ausiliario PCHar:
var
  paus: PChar;
  puntint: ^integer;
...
puntint^:= ...
paus := puntint;
inc(paus, sizeof(integer));
// e poi o questo:
puntint:= paus;
puntint^:= ...
//o (funziona?) questo (PInteger=^Integer, dichiarato in
type)
PInteger(paus)^:= ...;
Attento a fare il cast a PInteger: se no avrai errore,
perché non puoi mettere un Integer in un char (PChar punta
proprio a un char, se non è chiaro).
--
Paolo Giarrusso