Dynamické pole - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Dynamické pole

27. února 2001, 00.00 | Jeden z klasických problémů všech Turbo/Borland Pascalů a starších verzí Delphi je, jak vytvořit pole, jehož velikost se určí až při běhu programu. Jak na to vám ukáže tento článek!

Jeden z klasických problémů všech Turbo/Borland Pascalů a starších verzí Delphi je, jak vytvořit pole, jehož velikost se určí až při běhu programu (např. na základě požadavku uživatele). Samozřejmě, v Delphi od verze 4 jsou na to přímo v jazyku Object Pascal zabudovány prostředky, ale o to nám teď nejde. Uživatelů Delphi nižších verzí je stále dost a tak si ukážeme, že tento problém má své řešení i tam.

Předpokládejme, že chceme mít dynamické pole Integerů. V principu není problém uvedený postup rozšířit na libovolný jiný typ, Integer volím jen pro jednoduchost. Na začátek programu či unity, kde chceme pole použít, uvedeme následující deklaraci:

  type
    TPole = array[0..0] of Integer;
    PPole = ^TPole;

Jak je vidět, vytvoříme typ představující naše pole (zatím s jednou položkou) a ukazatel na ně. No a jak nyní pole vytvoříme? Nejdříve deklarujeme proměnnou P typu PPole (tedy ukazatel na pole) a pak jednoduše alokujeme potřebnou paměť standardní funkcí GetMem.

  var
    P: PPole;
    N: Integer; { sem se při běhu programu vloží
	 počet položek pole, které chceme alokovat }
  begin
    N := ...                        { zjistíme počet potřebných položek }
    GetMem(P, N * SizeOf(Integer)); { vlastní alokace }
    .
    .
    .
  end;

K jednotlivým položkám pole teď můžeme přistupovat skoro jako k normálnímu poli. Musíme ale vzít v úvahu, že P je jen ukazatel na toto pole, takže ho musíme dereferencovat. Takhle třeba přiřadíme první položce náhodou hodnotu od 0 do 99 včetně:

  P^[0] := Random(100);

A takto určitou položku vypíšeme na obrazovku:

  Writeln(P^[300]);

Pokud chceme změnit velikost alokovaného dynamického pole (což je docela častý jev), použijeme funkci ReallocMem. Způsob zápisu je skoro shodný s tím, když jsme pole vytvářeli:

  N := ...
  ReallocMem(P, N * SizeOf(Integer));

No a nakonec musíme pole také z paměti uvolnit. To se opět zařídí standardní funkcí, protentokrát s názvem FreeMem:

  FreeMem(P);

Tak, snad je vše jasné a pochopitelné. Je vidět, že i s omezenými prostředky se dají dynamická pole poměrně rychle vytvořit, stačí k tomu jen pár standardních funkcí a trochu "hraní si" s ukazateli. Uvedená metoda se dá implementovat i v podobě unity s několika funkcemi na práci s dynamickým polem, ale její případnou tvorbu už nechám na samotných čtenářích.

Poznámka: K funkčnosti popisované metody je třeba vypnout v nastavení překladače tzv. Range Checking (direktivou $R-). Pokud by totiž byl Range Checking zapnut, kompilátor by vygeneroval kód, který by nedovolil přístup k položkám pole mimo hranice (v našem případě jsou horní i spodní hranice rovny nule). V nastavení kompilátoru bývá většinou implicitně vypnut, takže by to nemělo činit problém. Pokud ho chcete mít mermomocí zapnutý (třeba kvůli ladění), můžete změnit hranice u deklarace typu TPole (tj. nejspíš posunout horní hranici někam hodně daleko) a postup bude fungovat stejně dobře dál.

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: