Duzine nizova

kakokako

Zainteresovan član
Banovan
Poruka
431
Medju programerima ima puno perfekcionista... ili ne... svejedno, pitanje: da li vas nervira kad morate da "lupite" neku duzinu niza, i po cemu zaista odredjujete duzine nizova u nekim situacijama?
 
U programiranju se nikad nista ne lupa... osim ako ne planiras da se izlupavas (onda mozes i na mnoge druge nacine). :lol:
Kreiranje dinamicnih nizova, oslobadja programera da sam "predvidi" koliko ce elemenata imati u nizu... osim ako nije vidovit pa u napred sve to odredi.;)

Duzina niza (u dinamicnim nizovima) je promenljivog tipa.
Recimo, ako zelimo ispitati neki tekstualni podatak te pronaci i locirati odredjenu rec u unetom tekstu, onda ce program dobiti i kreirati onoliko elemenata, koliko ima kraraktera u unetom tekstu. Primer: ako tvoj tekst ima 20 karaktera, tvoja ce se petlja izvrsiti 20 puta i t.d.
Ako zelis kreirati tabelu za unos fudbalkih timova a neznas koliko ce se fudbalskih timova unosti, onda ces kreirati onoliko polja, koliko se fudblaskih timova nadje u tabeli i t.d.

...ako sam dobro razumeo. :neutral:
 
U programiranju se nikad nista ne lupa... osim ako ne planiras da se izlupavas (onda mozes i na mnoge druge nacine). :lol:
Kreiranje dinamicnih nizova, oslobadja programera da sam "predvidi" koliko ce elemenata imati u nizu... osim ako nije vidovit pa u napred sve to odredi.;)

Duzina niza (u dinamicnim nizovima) je promenljivog tipa.
Recimo, ako zelimo ispitati neki tekstualni podatak te pronaci i locirati odredjenu rec u unetom tekstu, onda ce program dobiti i kreirati onoliko elemenata, koliko ima kraraktera u unetom tekstu. Primer: ako tvoj tekst ima 20 karaktera, tvoja ce se petlja izvrsiti 20 puta i t.d.
Ako zelis kreirati tabelu za unos fudbalkih timova a neznas koliko ce se fudbalskih timova unosti, onda ces kreirati onoliko polja, koliko se fudblaskih timova nadje u tabeli i t.d.

...ako sam dobro razumeo. :neutral:


Ne ne to sto ti pricas je drugo. Tu ima previse kopiranja memorije, te program tako gubi na brzini. Dobro je pitanje postavio onaj momak, jer ti dok kreiras i oslobodis te nizove o kojima pricas gubi se zaista dosta vremena i rada.
 
Naravno. Recimo ako pravis konzolnu aplikaciju i oces da imas kad pritisnes up arrpw da ti se vracaju reci koje si pre kucao, moras napraviti niz koji pamti iste, e sad, njegovu duzinu zaista moras lupiti.

Kod primera sa unosom teksta postoji vec odredjeni buffer koji prima podatke, a mozes praviti i drugacije, tako sto ces napraviti niz, fiksne duzine (max_chars, limit kako god) u koji pamtis user input, i funkciju za citanje.

U slucaju da napravis od pocetka bafer za 20 karaktera, a korisnika pustis da unese vise, onda ces kao budala praviti algoritme koji ako se predje velicina niza povecavaju niz... za jos 20 recimo, i sve tako...

samo, ne postoji nikakvo "povecavanje niza", ako ti je recimo


BYTE * niz

pokazivac na niz od 20 karaktera, a ti kasnije "dinamicki" povecas niz na 40, onda za to povecavanje moras da: napravis novi niz od 40, prekopiras: postojecih 20 podataka iz ovog niza, obrises prethodni niz, i postavis pokazivac na ovaj novi, sto sve oduzima masu vremena i moze brze da se uradi ako odma u pocetku napravis veci niz.

ReDim Preserve u visual basicu nije nista prosto, i da bi pricao da li je to ili nije dobro resenje moras prvo znati assembly.

U tom tvom "dinamickom" kopiranju starih nizova u nove itd. se gubi dosta vremena. Napravi aplikaciju koja cita input sa konozole, i ima od pocetka niz od 1 elementa (to i nije niz, al posmatrajmo tako) pa se za svaki novi uneti karakter povecava za jos 1 a za svaki izbrisani smanjuje itd. i veruj me da ce mnogo sporije da radi nego aplikacija koja ima fiksni neki bafer, koji prima podatke, i jedan count da se zna koliko je podataka uneto. Jer ce ova samo da pise nove podatke na mestu count, ili da ga smanjuje u slucaju backspace, a tvoja ce da svaki put kopira stare nizove u nove itd...
 
Poslednja izmena:
zato sluze ulancane liste da rese takve probleme :D
iil da se zajebavas sa realloc i sl

[Broj elemenata] [Adresa elementa 1] [Podaci] [Adresa elementa 2] [Podaci 2] [Adresa elementa 3]

U slucaju da ti je Podaci u stvari BYTE [8 bita], onda ce ti adrese sledeceg elemenata [32 bita] biti "Duze" od Podatka samog. Ako mislis na takve ulancane liste, tu onda moras koristiti recimo ceo 32bitni registar za smestanje adrese sledeceg elementa. Osim toga, moras ga i "puniti" sa adresom, umesto da samo povecavas registar ili neki drugi pokazivac za 1. Sta mislis sta je sporije.

malloc koristim a realloc ne.
 
Vi mislite da ako znate neki high level programski jezik znate automatski i kako to on prevodi na low level pa da mozete da tupite kupac o nizovima, a u stvari nemate pojma. Decko je postavio odlicno pitanje.
 
Imas listu. Svaki element liste neka ti bude niz odredjene duzine. Naprimer 10. Na taj nacin ces zauzimati 10 po 10 elemenata nizova, neces imati ogranicen niz i smanjices vreme pristupa u odnosu na listu. Ako hoces da pristupus 173 elementu, ides kroz listu 17 puta i u 17-elementu liste trazis 3(2 ako kreces od 0) element. Smanjices vreme pristupa 17 puta u odnosu na listu i nece biti ogranicena.
 
Mozes jos vise da smanjis.

Stavsi listu nizova od po 10 elemenata u kome ti se nalaze adrese onih nizova.

I ako oces da pristupis 170tom elementu ides na drugi niz adresa, uzmes 7mi elemenat, to ti je adresa, odes tu, i uzmes prvi.

:)
 
Ajde da se vratimo na temu. U osnovi postoje dve vrste nizova, dinamicki i staticki.
Kod statickih nizova na pocetku odredis duzinu niza. Sta se ustvari desava. Ti kad pravis staticki niz dobijes deo memorije ciji elementi idu jedan za drugim. Znaci prvi element je na pocetku, drugi odmah do njega i tako dalje. Zbog toga je pristup kod ovih nizova jako brz, ali je problem ako stavis da je veci imaces zauzetu neiskoriscenu memoriju.
Kod dinamickih nizova pristup je mnogo sporiji i maksimalna velicina nije definisana. Postoji razni nacini za realizaciju.
I jedno i drugo se isto koristi.
Lista nije isto sto i dinamicki niz. Ako te zanima sta je sta objasnicu ti.
 
Znam sta je lista, valjda si to sam video ...

SVE se svodi na kraju na fiksne nizove. Pa i ti "dinamicki" itd. samo sto kompajler pise tu assembly kod koji ti ne vidis, ti vidis samo NoviVelikiNiz * _niz = new NoviVelikiNiz (); KolekcijaMojihVelikihNizova->Add (_niz); i mislis da je na nivou procesora i busa i memorije i hard diska sve tako jednostavno.
 
Najbolje jos da kazete da je "zadnja rijec tehnologije" da se svaki element niza smesti u Page File, i da se prevrnem sa stolice pa da nema ko vise sa vama da se raspravlja.
 
Brate, studiram Racunarstvo i automatiku u Novom Sadu. Znam o cemu pricam i sta se desava ispod svega na najnizem nivou. Dinamicki niz mozes da realizujes kako oces, na kraju ti se sve svede na slicno, ali ipak razlicito.

Kad u dinamicki niz hoces da ubacis novi element, tj da ga prosiris, pravis novi niz koji je veci za 1(taman stari niz i novi element) i brises stari.

Rekao sam decku, posto predpostavljam da je pocetnik, najjednostavnije da shvati. Treba da mu pricam o bankama,stranicama, i ostalim stvarima, pa da nista ne skonta? Ti u C/C++ ako uvecas pokazivac na niz za 1 pojkazivace na sledeci clan. *(niz + 1) ti je isto sto i niz [1].
 
i ja se pitam, kakve to veze ima sa ovim, dal je *(niz +1)=niz[1]=1[niz] i td...

bolesnik:

zasto bi kad povecavas dinamicki niz brisao stari i pravio novi i posle brisao stari, samo
realloc(void*,velicina_bajt),povecas dinamicki niz za taj za sizeof(tip elemenata niza) i eto ga//
 
zato sto realloc trazi prazan segment u ramu cija je velicina ista ili veca od trazene i tu sve prebaci, a staro obrise, sto mu dodje na isto. sem u slucaju kada je segment u kom se nalazi dovoljno veliki,pa nema potrebe za trazenjem drugog, sto mu cesto dodje na isto. bar koliko me sluzi secanje
 
zato sto realloc trazi prazan segment u ramu cija je velicina ista ili veca od trazene i tu sve prebaci, a staro obrise, sto mu dodje na isto. sem u slucaju kada je segment u kom se nalazi dovoljno veliki,pa nema potrebe za trazenjem drugog, sto mu cesto dodje na isto. bar koliko me sluzi secanje

Ako me dobro sluzi secanje secanje ga sluzi dobro.

Isto tako ako ces u takvom nizu da izbrises od 1/8 do 1/4tine (neki broj elemenata) onda se 3/4 niza kopiraju, prepisuju, i to je jako sporo.
 
...Isto tako ako ces u takvom nizu da izbrises od 1/8 do 1/4tine (neki broj elemenata) onda se 3/4 niza kopiraju, prepisuju, i to je jako sporo.

Nije bas toliko sporo koliko ti dramatizujes stvari jer niko ovde ne iznosi svoje misljenje kako bi bio pametniji od drugih. Svako je duzan da kaze sta zna a decku ostaje da kompletira sliku o tome kako i kad koristiti razne tipove niza.

Sa druge strane, u zivotu se covek mora necega odreci kako bi postigao odredjeni cilj.
Sta hocu reci:
Ako ti upadne virus na sistemu pa ti osteti vitalne delove tvog OS-a, onda ti tu bilo koji AV ne moze pomoci (mada je to brzi nacin da se sacuvaju podaci a ukloni problem) vec si prinudjen da formatiras HDD mada je to posao koji dosta dugo traje jos uz to i gubis mnogo toga sa C:\ particije. Dakle, pod ovakvim okolnostima, formatiranje je jedino razumno resenje i ljudi ipak koriste i taj metod ciscenja i povratak OS-a (uz odradjeni gubitak).

Da zakljucimo: i dinamicni, kao i staticni nizovi, imaju i te kako svoje mesto u svetu programiranja i jednako su dobri, samo ne pod istim okolnostima.
 
Poslednja izmena:

Back
Top