(*****************)
                            (* Pole pointeru *)
                            (*****************)

program DemoDDS4;

const
  DelkaPole = 100;   { indexy 0..99 }
  MaxPocetPoli = 100;

type
  TPole = array[0..DelkaPole-1] of real;

var
  PoleP: array[0..MaxPocetPoli-1] of ^TPole; { pole pointeru }
  Delka: word;                               { celkova delka pole }
  PosledniPole: byte;                        { posledni alokovane pole }
  i: integer;

function DejPrvek(index: word; var ok: boolean): real;
var
  pole:  integer;
  prvek: integer;
begin
  if index < Delka then begin
    prvek := index mod DelkaPole;
    pole := (index-prvek) div DelkaPole;
    ok := true;
    DejPrvek := PoleP[pole]^[prvek];
  end else begin
    ok := false;
    DejPrvek := 0;
  end;
end;

procedure ZmenPrvek(index: word; vysl: real);
var
  pole, prvek, i: integer;
begin
  prvek := index mod DelkaPole;
  pole := (index-prvek) div DelkaPole;
  if (index >= Delka) and (pole < MaxPocetPoli) then begin
    for i := PosledniPole+1 to pole do New(PoleP[i]);
    PosledniPole := pole;
    Delka := (pole+1) * DelkaPole;
  end;
  PoleP[pole]^[prvek] := vysl;
end;

procedure VypisPrvek(index: word);
var vporadku: boolean;
begin
  write( DejPrvek(index,vporadku) :8:4);
  if vporadku then writeln('  Soucast pole')
              else writeln('  Mimo pole');
end;

begin
  New(PoleP[0]);             { alokovany je prvni pointer pole }
  PosledniPole := 0;         { zatim mame jedine pole - s indexem 0 }
  Delka := DelkaPole;        { celkova delka = delka jednoho pole }

  ZmenPrvek(56,2.22);
  VypisPrvek(56);
  writeln;
  writeln('     Pred zmenou prvku 128:');
  VypisPrvek(128);
  ZmenPrvek(128,5.5);
  writeln;
  writeln('     Po zmene prvku 128:');
  VypisPrvek(128);

  for i := 0 to PosledniPole do Dispose(PoleP[i]);
  readln;
end.