Egydimenziós dinamikus tömböket a programozási nyelv
Szimuláció egydimenziós tömbök dinamikus memória
Annak szükségességét, hogy eszközöket dolgozni egy dinamikus memória tömb feldolgozása közben fordul elő, amikor a statikus végrehajtása nem hatékony (például tömb méreteit jelentősen különböznek attól függően a felhasználói program és a lehető legmagasabb redundancia memória volume „minden alkalommal” elvesztegetett). Ebben az esetben, a lényege a „tömb” fogalom ugyanaz marad: a gyűjtemény az azonos elemeket, amely egyetlen nevet; elemek vannak elrendezve egy bizonyos sorrendben és a különböző indexek; e fölött lehet bármilyen műveletek sorozata engedélyezett típusú elemeket.
Ezek a tulajdonságok egyszerűen modellezhető dinamikus memória segítségével. Így vonatkozásai érdeklődés egy szoftveres megvalósítása, amely az alábbiakban tárgyaljuk.
A C-ben, a nevét egy statikus tömb egy pointer konstans első bájtjának az első elem a tömb. Tehát a leírás int a [5] lehet következőképpen illusztrálható:
Így a címet a tömb elem két módon, a mutató és az indexelés elem:
Ebben az esetben olvassa el a térelem is két módon, egy pointer elem és indexelés:
Memóriát alapvetően eltérő módon, és egyenlően kezeljük. Vegye figyelembe, hogy ez egy komoly hiba lenne azt feltételezni, hogy a leírás
Például, miután az üzemeltető
pa = (int *) malloc (10 * sizeof (int));
Amint a fenti, és egy tömb egy mutatót pa egyenértékűek minden értelemben. Ugyanakkor a második megoldás az lesz, rugalmasabb, mert itt a kért memóriát dinamikusan futásidőben, és adott esetben vissza kell juttatni a rendszert a free (), akkor nem abban az esetben a tömbben.
Tekintsünk egy beépített függvény malloc (), hogy dinamikusan memóriát a tároló elem tömb.
Sok problémát a matematika és számítástechnika végrehajtása információs struktúrák algoritmusok igény esetén tömbökkel, az elemek száma változik, ami az egyik fut egy másik programba.
A legegyszerűbb megoldás erre a problémára a statikus leírása az egyes tömbök a maximálisan szükséges elemek számát. Ez a megközelítés azonban általában vezet indokolatlanul nagy memóriakapacitás szükséges a program. Alternatív megoldást nyitott kapcsolatban a használata mutatókat, hogy képviselje a tömb.
Tegyük fel, hogy kell írni egy skalár szorzás programot a és b vektorok, a dimenziója, amely előre nem ismert. Ehhez a következőképpen járjon el. Leírjuk a cím a program változó m, hossza meghatározó a megfelelő tömböket, és az indexek a, b, c, amelyek meghatározzák egy memóriahelyet, és a vektor-vektor tényezők eredményeznek:
Miután az m értéke határozza (ez lehet például bevezetni egy terminál billentyűzet), meg kell kiosztani elég memória tárolja az összes három vektor. Mivel beszélünk dinamikusan kerülnek kiosztásra tömbök futási időben, fel kell használni az egyik a három speciális funkciókat, amelyek részei a standard malloc könyvtárban. h, melynek részleteit az alábbiakban adjuk meg.
malloc - fenntartja a memória blokk méretét byte; A kért memória szabadul végén a program vagy a szabadonfutó (cm. alább)
A méret és leírása érvek:
void * malloc (méret)
int mérete; / * A szükséges mennyiségű bájt memóriát * /
A fent leírt példában, a tömb mérete van megadva 10 * sizeof (int). Ez azt jelenti, hogy kiosztásra került a szükséges bájtok számát 10 tárolására egész típusú változók. sizeof funkció meghatározza a bájtok számát az egyik szabványos változó típusok (memória mérete tárolására változók típus táblázatban mutatjuk be az 1. igénypontban).
Mert malloc függvény visszatérési értéke egy mutató típusú meghatározatlan az első byte a fenntartott terület és a statikus memória egyenlő NULL hiányában a lehetőséget, hogy a kívánt méretű. Ahhoz, hogy a mutató egy adott adattípust kell alkalmazni a visszatérési értéke a művelet típus explicit konverzió. Például: int * malloc (méret).
Előzetes leírása mindezeket a funkciókat helyezünk stdlib.h és malloc.h fájlok és az azokat használó egyikük be kell vonni a forráskód a program segítségével a elõfeldolgozó irányelv #include.
A választás a mi feladatunk, hogy elférjen tömbök a, b és c függvény m alloc () írhatunk:
ahol vezetési művelet (float *) átalakítja a meghatározatlan típusú mutató a mutató típus úszó. Most, miután előre numerikus bemeneti elemek a vektorok, a skaláris szorzás végezhető:
for (i = 0; i Memory által kért rendszert a malloc () függvény vezethető vissza, hogy a befejezése a program segítségével funkció free (). Azonkívül használva realloc () funkció lehet változtatni a méret a korábban fenntartott memória blokk. Előzetes a funkciók leírását a free () és realloc () szintén StdLib fájl () és malloc (), és a szükséges információkat róluk az alábbiak. ingyenes - Szabad memória blokk korábban fenntartott egyik feladatot malloc () és realloc () A méret és leírása érvek: void * ptr; / * Pointer az elbocsátott blokk * / Ez a funkció a munkájuk következtében nincs visszatérési értéke. Sőt, figyelmen kívül hagyja a mutatót ptr, ha ez egyenlő NULL. realloc - átméretezi memória blokk korábban fenntartott funkciók malloc () és realloc (). A méret és leírása érvek: void * realloc (ptr. méret) void * ptr; / * Pointer korábban * / / * Fenntartva memória blokk * / int mérete; / * Egy új blokk mérete bájtban * / A visszatérési érték egy mutató típusú meghatározatlan az első byte a fenntartott terület és a statikus memória egyenlő NULL hiányában a lehetőséget, hogy a kívánt méretű. Általánosságban elmondható, hogy nem egyenlő a mutató ptr, hiszen amikor a blokk méret megváltoztatását is változtathatja a helyét a számítógép memóriájában. Ahhoz, hogy a mutató egy adott adattípust kell alkalmazni a visszatérési értéke a művelet típus explicit konverzió. Most, hogy tudjuk, hogyan lehet használni a dinamikus memória tároló tömb, írhat programkódot a problémánkra skalárszorzat két vektor. Helyénvaló lenne, hogy még szétszedni a példa a változás az egydimenziós dinamikus tömb a program végrehajtása során. Ahhoz, hogy elemezni ezt a problémát, amelyben a bejuttatott szekvencia változások (1-5) és a számtani középértéket számított. Értékelések száma nem ismert előre, a végén a szekvencia - 0. # include Kapcsolódó cikkek