(********************************************)
              (* Plne dynamicke pole s urcenim jeho delky *)
              (********************************************)

program DemoDDS3;

type
  PInt = ^integer;

var
  pole: pointer;         { pointer na budouci plne dynamicke pole }
  p_i: PInt;             { pointer, pomoci ktereho se budeme v poli pohybovat }
                         { pozor - nemuzeme pouzivat indexy! }
  delka,prvku,i: integer;

procedure NactiPrvky(kam: PInt; kolik: integer);
var i: integer;  { adresa ulozena v pointeru kam se ve skutecnosti mimo
                   funkci nezmeni }
begin
  for i := 1 to kolik-1 do begin
    write(i:2,': ');
    readln(kam^);
    inc(kam);
  end;
  write(kolik:2,': '); { pozor, abychom se neposunuli az do pameti, ktera }
  readln(kam^);        {   nam nepatri }
end;

procedure VypisPrvky(ktere: PInt; kolik: integer);
var i: integer;
begin
  for i := 1 to kolik-1 do begin
    write(ktere^:4);
    inc(ktere);
  end;
  write(ktere^:4);
end;

begin
  write('Zadejte delku pole: (alespon 2) ');
  readln(delka);
  if delka < 2 then delka := 2;
  GetMem(pole, delka * sizeof(integer));
  p_i := pole;   { promenna pole obsahuje adresu, takze nepouzivame @ }

  write('Kolik prvku pole chcete zadat? (alespon dva) ');
  readln(prvku);
  if prvku < 2     then prvku := 2;
  if prvku > delka then prvku := delka;
  NactiPrvky(p_i, prvku); { pointer p_i zustava nastaven na zacatku pole }

  writeln;
  writeln('Prvky pole:');
  VypisPrvky(p_i, prvku);

  FreeMem(pole, delka * sizeof(integer));

  writeln;
  writeln('V teto chvili muzeme pouzit misto, ktere zabirala promenna');
  write('"pole", k jinym ucelum - je volne');

  readln;
end.
{ kdybychom chteli vedet, kde momentalne v poli je pointer p_i,
  zavedeme novou promennou index, ktera se bude menit pri kazdem
  pohybu p_i -> vime, jak daleko od zacatku pole jsme a muzeme
  kontrolovat, jestli se pri posunu nedostaneme mimo pole }