Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Opet niz

[es] :: C/C++ programiranje :: Opet niz

Strane: 1 2

[ Pregleda: 5478 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Opet niz08.04.2002. u 12:49 - pre 268 meseci
Kako da pravim niz dinamicki? U toku kompajliranja nije poznato koliki ce biti niz, niz je jednodimenzionalni. Ja sam nesto oavako pokusao ali rezultati nisu zadovoljavajuci. Iako sam ubacio da se pointer inkrementira, on izgleda stalno upisuje na jedno te isto mesto odonsno na prvi clan. Program u pokusaju :) je:
Code:

#include <iostream.h>

int main()
{
    int *iScore;
    int j, temp = 0;

    for (j = 0; j < 20; j++)
    {
        cout << "Enter score (-1 to exit): ";
        iScore = new int;
        cin >> *iScore;

        if (*iScore == -1)
            break;

        *iScore++;
        temp++;
    }

    cout << endl;

    for (j = 0; temp--; j++)
        cout << " " << iScore[j];

    cout << endl;

    return 0;
}


P.S. Kada sam ovo postovao naknadno sam poobrisao i promenljive i stavio j, tako da mozda ima nekih sitaksnih gresaka.
 
Odgovor na temu

anon676

Član broj: 676
Poruke: 759
*.verat.net



Profil

icon Re: Opet niz08.04.2002. u 14:24 - pre 268 meseci
hmmm..pogledajmo samo ovaj deo koda...kao prvo nisi nigde inicijalizovao niz...kapiras
ti si ovde odredio pokazivac na iscore, odnosno iscore pokazivac tipa int...i odredio si neke vrednosti (obican ceo broj) j i temp si odredio da je nula...nigde nisi inicijalizovao niz
nizovi se inicijalizuju sa:

tip ime[ceobroj];

npr
int j[5];

mozes da ga punis sa for petljom
ili jednostavno mozes da kazes
int j[5]={1,2,3,4,5};
razumes ovim si napunio niz ovim ciframa, i jos nesto unutar niza mogu se puniti samo vrednosti istog tipa...nizovi i pokazivaci su blisko povezani...tako da moras da izucis i pokazivace...btw..imas i visedimenzionalne nizove. najcesce se koriste dvodimenzionalni.

gledaj ovako.

int a[2][5]; -je trodimenzionalni niz, jer kod nizova u jeziku c se nizovi broje od nule, znaci ovde ces imati 0, 1,2 niz, a 5 ce biti broj vrednosti odnosno broj kolona. razumes li ti mene? :)

tako da mozes dodavati vrednosti...odnosno dimenzije


<b>
#include <iostream.h>
int main()
{
int *iScore;
int j, temp = 0;
</b>

 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Re: Opet niz08.04.2002. u 14:59 - pre 268 meseci
O, covece ala se nalupeta, lepo stoji u mom postu dinamicki niz, ovo sto si ti ovde napisao stoji u drugom poglavlju svake kjnige o C-u!
Ja ne znam u trenutku pravljenja programa koliko ce niz imati clanova, da na primer znam da ce imati 5 clana onda bih deklarisao int a[5];, btw to i nije inicijalizacija vec deklaracija. Jedino sto se zna u vezi niza (u trenutku pravljenja) je da je niz jednodimenzionalni, ali se ne zna koliko ce clanova imati, zbog toga sam ja pokusao da sa dinamickim dodeljivanjem memorije na heap-u, pomocu iScore = new int; ali, je problem sto se pomocu aritmetike pokazivaca, ovde *iScore++ ili iScore++ pokazivac ne pomera za jedno (int) mesto i da onda mogu opet da doelim memoriju, vec je i dalje na istom mestu i na istom mestu upisuje sve brojeve, ili je problem u necemu drugom.
Na primer ako ce nizu trebati mesta za 8 clanova on rezerve\ise memoriju za 8 clana i dodeli korisnikov ulaz svima.
Zamlio bih, ako neko razume o cemu pricam, da mi da savet kako da ovo resim.
Hvala.
 
Odgovor na temu

anon676

Član broj: 676
Poruke: 759
*.verat.net



Profil

icon Re: Opet niz08.04.2002. u 15:38 - pre 268 meseci
ja sam kao dinamicki niz koristio int niz[] i on mi je brojao sve sam...
ali za tebe ne znam...sta u stvari hoces da uradis. koristis strukture...
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Re: Opet niz08.04.2002. u 17:18 - pre 268 meseci
Da li stvarno govorim tako nejasno !?
Ovako za ovo sto ja zelim da uradim, jedno od resenja je linked list, znaci npr. da ne trosim memoriju na one clanove koje ne koristim, npr. korisnik treba da unese nekoliko brojeva ali ne zna koliko brojeva da ce trebati da unese, mozda recimo danas treba da unese 5 broja a sutra 11 broja. I sada po darkmind-u bih ja mogao da resim problem tako sto bih deklarisao niz od 100 clanova int ArrayOfInt[100]; i onda ce korisnik uvek imati dovoljno rezervisane memorije, ako unosi do 100 brojeva. Ali, sta ako jednog dana treba da unese 102 clana, doci ce do prekoracenja. Ili sta ako on od tih 100 alociranih clanova koristi samo npr. 5, tj. unese 5 broja, a ostalih 95 u nizu ostanu neiskoriscenji, sto znaci da ako je sizeof(int) == 4 onda 4 x (tih 95 neiskoriscenih mesta)95 = 380 neiskoriscenih bajtova memorije! Ovo je naravno samo primer.
Znaci, da ne koristim LL (linked list) nego obican int array kako bi ovo moglo da se resi?
Jos jednom, moja ideja, kao sto je u gornjem postu, bila sledece, da se rezervise mesto u pointeru za jedan int i onda korisnik unese jedan broj, ako korisniku treba jos jedan broj opet se alocira memorija ( iOcena = new int), ako mu nakon toga ipak treba da unese u niz jos jedan broj, onda se opet alocira memorija za jos jedan int. I nakraju niz je velik tacno onoliko koliko je korisnik uneo broja, u ovom slucaju uneo je 3 broja, a niz je velik 3 broja. Znaci nije se unapred deklarisalo koliki ce niz biti, nego se on pravio u toku izvrsavanja programa.
Iskreno se nadam da sada neko razumeo na sta mislim, znaci metoda povezane liste (LL) ali se koristi najobicniji int niz, i dinamicka alokacija memorije.
Pozdrav.
 
Odgovor na temu

anon676

Član broj: 676
Poruke: 759
*.beotel.net



Profil

icon Re: Opet niz08.04.2002. u 17:24 - pre 268 meseci
if (*iScore == -1)
break;
*iScore++;
temp++;
}


greska je negde gore pa je ti nadji :)


 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Re: Opet niz08.04.2002. u 19:00 - pre 268 meseci
Gde je greska ??
 
Odgovor na temu

anon676

Član broj: 676
Poruke: 759
*.beotel.net



Profil

icon Re: Opet niz08.04.2002. u 19:48 - pre 268 meseci
ovo ne radi...ne moze to tako...ides samo bez pointera, pa ce da radi valjda nisam probao...

*iScore++;
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Re: Opet niz08.04.2002. u 19:53 - pre 268 meseci
Stvarno ne razumem o cemu pricas, kako bez pointera ??
 
Odgovor na temu

anon676

Član broj: 676
Poruke: 759
*.beotel.net



Profil

icon Re: Opet niz08.04.2002. u 20:01 - pre 268 meseci
vidim jednom si vec rekao char *pointer ili sta vec...vise ne moras, ne znam lepo to da objasnim jer nisam jos u potpunosti savladao pointere :))
npr kazes:
char k****, *p;
i onda:
p=&k****; ili p=k****;
ili sta vec
e to ti je malte ne isto
samo sto ti radis *p++ odnosno *p=*p+1;
ali ja bih uradio p++, osnosno p=p+1 razumes?
nego ajd dodji na irc pa da popricamo
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Re: Opet niz08.04.2002. u 21:35 - pre 268 meseci
Pokusao sam to, tj. bez znaka * ali opet nije radilo.

Zar niko ne zna da mi da savet kako da ovo resim !??
 
Odgovor na temu

anatogen
Novi Beograd

Član broj: 1294
Poruke: 150
*.ppp-bg.sezampro.yu



Profil

icon Re: Opet niz09.04.2002. u 01:40 - pre 268 meseci
Citat:
aster:
Kako da pravim niz dinamicki?


Koriste se funkcije malloc i slicne koje aliciraju memoriju na heapu tj. vracaju ti pointer na onoliko memorije koliko ti treba...

E, ja sam siguran da sam negde ovde vec odgovorio na isto pitanje i stvarno sramota sto te mrzi da uradis jedno search pre nego sto postavis pitanje...
vitamini, minerali, suplementi...
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Re: Opet niz09.04.2002. u 02:48 - pre 268 meseci
Nemoj da se uvredis, ali je sramota sto ti nisi pogledao moj post na vrhu, i video listing kojim sam ja pokusao da resim problem. Video bi da sam koristio new operator koji je C++ ekvivalent C funkciji alloc i malloc.
Problem u mom listingu je u necemu drugom, a ne kako da kreiram memoriju na heap-u odnosno na slobodnom skladistu, objasnjavao sam nekliko puta do sada u ovom postu sta mi predstavlja problem, tako da ne mogu opet da pisem o tome, zato jos jednom ako neko moze da pomogne, bio bih zahvalan.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..ndg-pm4-1.dialup.nethere.net



+6 Profil

icon Re: Opet niz09.04.2002. u 02:49 - pre 268 meseci
Ako već koristiš C++ a ne C, onda je pravi izbor za tebe klasa std::vector. Pogledaj malo dole po forumu.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Opet niz09.04.2002. u 09:33 - pre 268 meseci
Citat:
aster:
new int; ali, je problem sto se pomocu aritmetike pokazivaca, ovde *iScore++ ili iScore++ pokazivac ne pomera za jedno (int)


U tvom kodu postoji vise logickih gresaka.

Prva je u sledecem:

Ako je iscore pointer, na sledeci element niza postavices ga sa
iscore++. Ono sto si ti napisao, *iscore++, uvecava za 1 ono na sta pokazuje iscore, znaci isto je kako i (*iscore)++.

Drugi problem je u tome sto je to uvecavanje za 1 nepotrebno. Stvar je u tome sto new uvek vraca pointer na mesto na kom je alocirao novu vrednost za tvoju promeljivu. Ti ne mozes da uvecavanjem iScore za 1 naredis new da alocira novi integer odmah iza prethodnog cak ni principijeno jer postoji rezijski prostor koji sadrzi podatke o bloku kog si alocirao itd. Mozda si iz toga izvukao "zakljucak" da uvecavanje za 1 "ne radi".


Jedini (dobar) nacin da imas niz promenljive duzine jeste da alociras prvo niz fiksne duzine i pamtis broj validnih elemenata u njemu, zatim ga popunjavas a onda realociras: napravis novi, duplo veci niz, prekopiras validne elemente iz prethodnog u novi, namestis pointer za trenutni niz na novi i zatim unistis prethodni. E sad i ovo je samo principijelno resenje posto ako imas niz cija duzina osciluje oko duzine jednog segmenta niza, kada se niz produzuje i skracuje u segmentima, imas i veliki performance hit jer ces stalno smanjivati i produzavati niz.

Da se ne bi zamlacivao pisanjem programa koji sve ovo ume, posto su ljudi vec "seli i napisali", uradi ovo:

Code:

#include <vector>

using namespace std; /* Ne znam da li je ovo potrebno posto koristim G++ kome je svejedno */
...
vector<int> niz;


Normalno, mozda ces nekada hteti da vidis kako to izgleda i ispod haube. Za sada ovo radi to sto hoces i to radi vrlo efikasno.

niz sada mozes koristiti kao da je deklarisan kao obican niz.

Vrlo je dobra ideja i napustiti kretensku Madjarsku notaciju (kodiranje tipa u imenu promenljive) jer je to cista glupost i pisati recimo this_score umesto ThisScore.

f.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Opet niz09.04.2002. u 18:17 - pre 268 meseci
Samo da malo dopunim:

using namespace std;

je obavezno po ISO standardu za C++. Biblioteke koje se isporučuju uz g++ zaostaju za standardom i zato kad koristiš te biblioteke, kompajler se ne buni kad izostaviš "using". Međutim, mislim da je samo pitanje vremena kad će i te biblioteke da se dovedu u red, pa najtoplije preporučujem da se obrati pažnja na namespace.
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.ptt.yu



Profil

icon Re: Opet niz09.04.2002. u 19:23 - pre 268 meseci
Znaci ne moze nikako preko obicnog niza, odnsono ipak mora da se koristi povezana lista. Ovo resnje koje filmil izneo (ne ono sa vektorim) nije u potpunosti zadovoljavajuce, sto si i sam rekao, pored toga sto je malo komplikovano ipak mora da se zada fiksna velicina niza.

Ako vec mora da se koristi povezana lista, a vecto je valjda templejt klasa, tako? Ako vas ne mrzi da li mozete malo vise da kazete o njoj i kako bi konkretno koristila u ovom primeru koji je napisao filmil?
I jos nesto :) interesuje me, posto sam u help nasao malo tj. nedovoljno objasnjenja o using namespace std pa opet ako nije tesko dobro bi mi doslo i objasnjenje o tome?

Hvala.
 
Odgovor na temu

anatogen
Novi Beograd

Član broj: 1294
Poruke: 150
*.ppp-bg.sezampro.yu



Profil

icon Re: Opet niz09.04.2002. u 19:34 - pre 268 meseci
Citat:
aster:
Nemoj da se uvredis, ali je sramota sto ti nisi pogledao moj post na vrhu, i video listing kojim sam ja pokusao da resim problem. Video bi da sam koristio new operator koji je C++ ekvivalent C funkciji alloc i malloc.


Sorry, priznajem da nisam procitao celu diskusiju a vec skocio da kritikujem...
kad ovaj sistem ocena bude proradio dacu odmah sebi keca !
vitamini, minerali, suplementi...
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.tehnicom.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Opet niz09.04.2002. u 19:58 - pre 268 meseci
Citat:
aster:
Kako da pravim niz dinamicki? U toku kompajliranja nije poznato koliki ce biti niz, niz je jednodimenzionalni. Ja sam nesto oavako pokusao ali rezultati nisu zadovoljavajuci. Iako sam ubacio da se pointer inkrementira, on izgleda stalno upisuje na jedno te isto mesto odonsno na prvi clan. Program u pokusaju :) je:


E sada je samo pitanje da li ti mislis pod dinamickim nizom na isto sto i mi :)),Ono na sta nas vecina ovde misli jeste da uzmes i alociras memoriju sa operatorom new pre pocetka unosenja, znaci pitas korisnika pre pocetka unosenja.
Code:

int n;
cout << "Od koliko clanova zelite niz";
cin >> n;
iScore=new int[n];

i na kraju koriscenja obrises sa delete []iScore; taj niz

e a akone znas ni u toku unosenja koliki je niz dugacak onda tebi treba lista ili da napravis sam svoju klasu koja ce menjati velicinu niza koja bi imala neku metodu ProsiriNiz(int velicina_novog_niza)

e sada ta metoda bi alocirala novu duzinu niza kopirala stari niz u novi. obrisala dinamicku alokaciju starog niza, i setovala da pokazivac na niz pokazuje na taj novi niz. E sada to je relativno skup proces kada vidis sta je sve potrebno za dodavanje samo jednog clana. Ali opet kasnije nemas ti je dosta lakse da radis sa tim nizom neko da koristis povezanu listu. Opet sa druge strane ako se odlucis da uradis svoju korisnicku klasu koja ce to raditi, savetujem ti da to uradis kao template klasu, da mozes da ju koristis za prozvoljni tip podataka da ne budes prinudjen da pises tu istu klasu za svaki tip podataka pojedinacno.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
213.218.76.*

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Opet niz09.04.2002. u 21:47 - pre 268 meseci
Citat:
aster:
Znaci ne moze nikako preko obicnog niza, odnsono ipak mora da se koristi povezana lista. Ovo resnje koje filmil izneo (ne ono sa vektorim) nije u potpunosti zadovoljavajuce, sto si i sam rekao, pored toga sto je malo komplikovano ipak mora da se zada fiksna velicina niza.


Sto se tice fiksirane velicine niza, tj povecavanja niza u fiksnim 'etapama' (recimo po 10 elemenata), to je zapravo najbolje resenje posto ima najmanju amortizovanu slozenost. U to mozes lako da se uveris ako pronadjes na netu recimo analizu slozenosti algoritama koji se koriste za template klase, jer su upravo oni najbolji uzeti kao osnova.

Mozes da namestis da 'etapa' bude velika 1 element i tada ce niz uzimati tacno onoliko memorije koliko je zaista i potrebno, ali ces u tom slucaju prilikom svakog umetanja imati najgori slucaj obrade (ciklus: alociraj, kopiraj, unisti). Za zaista velike strukture to je najbolji nacin a neiskorisceni rezijski prostor je minimalan. Za male nizove je zapravo nebitno koliko zaista zauzimaju.

Template klasa vector radi upravo ono sto si hteo. Kada deklarises niz na ovaj nacin, ne moras da eksplicitno zadajes duzinu niza i niz ce rasti kako ga budes punio podacima.

Dakle, posle

Code:

vector<int> niz;


mozes da uradis:

Code:

niz[0] = 1;
niz[1] = 2;

/* itd... */

/* zatim: */

a = niz[0]; /* Tj. sve ostalo je kao i obicno */


I niz ce rasti kako budes upisivao elemente. Ja sam medjutim ukratko opisao i kako ova template klasa (sablon?) radi "ispod haube", ali ti za primenu to uopste nije potrebno da znas.

Poenta: vec je napisano, iskoristi to. Ziveo C++, zivela Meng Li, Aleksandar Stepanov i template klase.

f.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Opet niz

Strane: 1 2

[ Pregleda: 5478 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.