Dinamikus tömbök delphiben, különböző cikkek, cikkek, programozás - programozás c,

Új oldal 1

A tömb rendezett adatkészlet. Rendszerint a tömb elemeinek száma korlátozott. A Delphi környezet az Object Pascal nyelvének szintaxisát használja, és utóbbi szerint a tömbök így deklaráltak:







Ha az index1 és az indexN egy rendezett típushoz tartoznak, amelyeknek a Delphi 6 dokumentációjában leírtak szerint nem haladja meg a 2Gb értéket. BaseType √ a tömbelemek típusa.

Megállapítottuk, hogy a My_Array tömb, amely 100 Real elemű elemből áll. A rétegek lehetnek egydimenziósak, kétdimenziósak és n-dimenziósak. Elméletileg nincs korlátozás a tömb méretére, a gyakorlatban a dimenziót a rendelkezésre álló memória korlátozza.

Mindez igaz a statikus tömbökre. Azonban a statikus tömbök jelentős hátránnyal rendelkeznek. A legtöbb esetben nem tudjuk, hány elemet tartalmaz a tömbünk. Ezért meg kell tartanunk a "tartalékban" tárolt memóriát: jobban tartom a memóriát a tömb további tíz elemére, mint a tömb egyik eleme felesleges. Például egy fájlból származó információk olvasása során nem tudjuk, hány elemet olvashatunk: egy, kettő, tíz vagy száz. Általában dinamikus LIFO listák (Last In First Out, stack) vagy FIFO (First In First Out, turn) használtak ilyen problémák megoldására.

A Delphi fejlesztői a termék legújabb verzióiban (5,6) valósították meg a dinamikus tömbökkel való együttműködéshez viszonylag rugalmas mechanizmust. Nem kell dinamikus listákat létrehoznunk, soha nem fogjuk elfelejteni a "^" karakter felvételét a listaelemek elérésekor, és egy ideig el fogunk felejteni az új, jelölési és eldobási eljárásokat.

Megjegyzés. A korábbi verziókban (például 3) egy ilyen mechanizmus nem létezett.

Amint láthatja, csak azt mondjuk a Delphi-nek, hogy egy Real-típusú egydimenziós tömbre van szükségünk, és egyszerűen elfelejtettük a méretét.

Miután meghívta ezt az eljárást, a tömb 100 elemének memóriája kiosztásra kerül, amelyet 0 és 99 között kell indexelni (megjegyzés: az indexelés nulla, és nem egy!) Kezdődik.

A dinamikus tömbök implicit iránymutatók, és ugyanazt a mechanizmust szolgálják fel, mint a hosszú vonalak feldolgozásához. A dinamikus tömb által elfoglalt memória felszabadításához hozzárendelje a nil: A: = nil értéket a tömbre hivatkozó változóhoz.

A gyakorlat nélküli száraz elmélet semmi, ezért az anyag legjobb emésztéséhez a következő programot vegye figyelembe:

Ezután nyissa meg a Watch List ablakban nyomja meg a Ctrl + Alt + W, és állítsa Stay On Top ablak módban (csapat marad a tetején jelenik meg a pop-up menüben, amikor jobb gombbal bárhol az ablakban), hogy az ablak a szeme elől amikor a programot futtatod 1. Az 1. listában, az egyes sorok mellé az A és B változók értékeit adtam meg a vonal áthaladása után. Ahogy észrevetted, csak azokat a sorokat számoztam meg, amelyek az A és B változókat megváltoztatják.







1. sor: az A és a B változók számára nincs memória. Ezért a következtetés: a SetLength eljárás meghívása előtt lehetetlen dolgozni a tömbön. A második sorban a memóriát csak az A tömbre osztják ki. Mivel az A változó globális, a tömbelemek értékei visszaállnak. Ha az A változó helyi, akkor meg kellett kezdeni a tömb elemeit. A helyi változók nem nulla, és általában tartalmaznak véletlenszerű értékeket (szemetet) a memóriából, amelybe a változó található.

A harmadik sorban szánunk az array tömb A. B nem kell kiosztani memória tömb B SetLength Mielőtt ezt a műveletet. Amikor hozzárendeljük a B-elem [0] van rendelve egy [0] elem, B [1] √ A [1], stb Ügyeljen arra, hogy a 4-es vonal: mi új értékeket a tömböt, és automatikusan (tömbök √ azonos mutatók) tömb elemeit B rendelni pontosan ugyanolyan értékeket, és fordítva: kellene változtatni bármelyik eleme a B tömb, módosítsa a tömb eleme egy, a megfelelő index .

Most kezdődik a móka. Az A tömb (5. sor) hosszának megváltoztatásakor a tömbök közötti kommunikáció megszakadt. Ezt a jelenséget a 6. sor mutatja be, amely egy sor hozzárendelési operátort tartalmaz. Először is rendelheti az értékeket a tömb elemeinek A: 2, 4, 5, majd próbálja megváltoztatni az értékét az elem A [0], hozzárendeljük a B elem a [0] 1. De mint láttuk, a kommunikációt a tömbök nincs és megváltoztatása után az érték a B elem [0], az A [0] elem értéke nem változott. Egy másik fontos pont: ha változik a hossza a tömb egyszerűen hozzá egy új elemet, veszteség nélkül a meglévő pixel értékek (5 sor). A kapcsolódó B tömb hossza nem változik.

A 7. sorban felszabadítjuk az A. tömbhöz rendelt memóriát. A "B" tömb a program végéig fennmarad. A nulla hosszúságú tömbök nulla értéket tartalmaznak.

Meg kell mondanom néhány szót a tömbök összehasonlításáról:

Az A = B vagy a B = A összehasonlításakor igazat nyerünk: a tömbök egyenlőek. De ebben a helyzetben összehasonlítva hamis képet kapunk:

Amikor megpróbál értéket rendelni a statikus tömb elem, amelynek indexe határain kívül a tömb, megkapjuk a megfelelő hibaüzenet: állandó kifejezés sérti subrange határokat (megsértésével tartományhatárokat). Amikor dinamikus tömbökkel dolgozik, nem fog látni hasonló hibát. Egyrészt jó, másrészt rossz. Meg lehet tölteni egy csomó időt, hogy kitaláljuk, miért nem lehet értéket rendelni a tömb elemének az indexe 4, amíg meg nem találja, hogy az elején a program, viszont csak az a három elem. Most ez a helyzet nevetségesnek tűnik, de sokkal gyakrabban történik, mint gondolná. A SetLength függvény EOutOfMemory hibát generál, ha nincs elég memória a tömb hozzárendeléséhez.

Ne használja a "^" operátort a dinamikus tömbváltozón. Továbbá nem szabad egy tömbváltozót átadni az új vagy az ártalmatlanítási eljárásoknak a kiosztáshoz vagy a szabad memória elosztásához.

A dinamikus tömb hozzárendelése után átviheti a tömböt a Hosszúság, Magas és Alacsonyabb funkciókra. Hossza számát adja vissza a tömb elemeinek, Nagy visszaadja a tömb legnagyobb index (vagyis a hossza √ 1), alacsony hozamok 0. Abban az esetben, a tömb hossza nulla van egy paradox helyzet: Nagy visszatérési értéke -1 és alacsony √ 0, kiderül, hogy Nagy

Hogyan használhatjuk a Magas és Alacsony funkciókat a legnagyobb hasznot? Ehhez vegye figyelembe az init eljárást és az összegfüggvényt. Az első közülük inicializálja a tömböt (az elemek értékeit nullázza), a második √ a tömbelemek összegét számítja:

Egy dolog nem tisztázott: lehet többdimenziós dinamikus tömböt használni? Igen, tudjuk. Kijelenthet egy kétdimenziós tömböt:

A memória elosztásához a SetLength eljárást két paraméterrel kell hívni, például,

A kétdimenziós dinamikus tömb használata ugyanaz lehet, mint a statikus:

Nem négyszögletes tömböket hozhat létre. Ehhez először meg kell jelölni egy tömböt:

Ezután hozzon létre n sorokat, de oszlopok nélkül,

Most különböző hosszúságú oszlopokat hozhat létre:

Megjegyzés. Ha a Delphi korábbi verzióival dolgozott, valószínűleg tudni fogja, hogy a SetLength függvényt dinamikusan változtatták meg a húr hosszán. Valószínűleg nem használtátok, mert a sor hosszát a hozzárendelési művelet során automatikusan megváltoztatták.




Kapcsolódó cikkek