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:
|
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.
|
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ě:
|
A takto určitou položku vypíšeme na obrazovku:
|
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:
|
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:
|
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.
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007