[ vladab @ 27.02.2005. 23:31 ] @
Imam funkciju koja brise stablo i koja nece da se iskompajlira:
Code:
int btree::obrisi(){
    drvo *next=koren;
    stack<drvo*> stek;
    while (NULL!=next){
        stek.push(next);
        next=next->levo;
    };
    while (!stek.empty()){
        next=stek.pop();// ******ovde je greska koju ne razumem*****
        if (next>0){
            stek.push(-next); 
            next=next->desno;
            while (next!=NULL){
                stek.push(next);
                next=next->levo;
            };
        }
        else{
            next=-next; //
            delete next;
            }
    }


Greska je : void value not ignores as it ought be
Sta to znaci?
[ Dragi Tata @ 28.02.2005. 00:30 ] @
Funkcija pop() ne vraća vrednost, odnosno deklarisana je kao void. Pogledaj definiciju šablon klase std::stack.

U principu, moraćeš da koristiš funkciju top() da dobiješ element, pa onda pop() da ga izbrišeš sa steka. Slažem se da je malo čudno, ali tako je...
[ vladab @ 28.02.2005. 00:37 ] @
Resio sam, ali vidim da me je DT pretekao sa odgovorom. Hvala!
Ako moze jos jedno pitanje: Ovaj red:
Code:
next=-next;
Zasto to ne radi? zasto pokazivac ne moze da bude negativan. Resio sam problem, ali mi deluje kao strasno lose resenje :
Code:
temp = -(int)next;
next=(drvo*)temp;

Imam utisak da se ovde nesto gubi, mada za sada ne primecujem, posto program radi.
[ filmil @ 28.02.2005. 09:32 ] @
Citat:
Zasto to ne radi? zasto pokazivac ne moze da bude negativan. Resio sam problem, ali mi deluje kao
Pokazivač nije broj, pa ne možeš da očekuješ da s njim rade aritmetičke operacije. To što igrom slučaja se pointeri na tvojoj konkretnoj mašini prikazuju kao brojevi nema nikakvog značaja.

Ne možeš sabirati pointere niti ih oduzimati, osim naravno ako ne preopteretiš operatore. Možeš da sabereš pointer sa celim brojem i tada je semantika: p + i == p[ i ]. (pretpostavi da je p pointer a i ceo broj).

Pošto nisi napisao koja se greška javlja ne mogu ništa više da iskomentarišem.

f
[ vladab @ 28.02.2005. 11:08 ] @
Citat:
filmil:To što igrom slučaja se pointeri na tvojoj konkretnoj mašini prikazuju kao brojevi nema nikakvog značaja.

Pošto nisi napisao koja se greška javlja ne mogu ništa više da iskomentarišem.
f

Sasvim dovoljno. Zanima me samo da li ce da radi onaj kod koji sam postavio, ako umesto
Code:
next=-next;
stavim
Code:
temp = -(int)next;
next=(drvo*)temp;

[ _Super_Ellite_Bug_ @ 28.02.2005. 11:29 ] @
Nad pointerima istog tipa koji ukazuju na isti niz moze biti izvedena operacija utvrdjivanje distance u trenutnom memorijskom modelu kao ptrdiff_t tip:
Code:

int niz[10], *q = niz, *r = niz+10;
ptrdiff_t diff1 = q-r, diff2 = r-q;  

//kao rezultate(distance) imacemo :diff1== -10, diff2 = +10
[ filmil @ 28.02.2005. 11:46 ] @
Citat:
Sasvim dovoljno. Zanima me samo da li ce da radi onaj kod koji sam postavio, ako umesto
bug je napisao, ali nije naglasio: pointerska aritmetika ima smisla samo ako pointeri pokazuju na isti niz. U bilo kom drugom slučaju rezultat je nedefinisan. (Mislim da ovaj uslov ima veze i sa uslovom kog postavlja C, da elementi nizova moraju da budu smešteni u uzastopne memorijske lokacije.) To uključuje i slučajeve tipa p[-1] itd.

Ako dobro poznaješ mašinu na kojoj radiš, možeš da kroz konverzije isforsiraš da ti kod radi ono što si hteo, ali će to onda raditi samo na tvojoj mašini. Možda je bolje da opišeš šta u stvari želiš da postigneš, mora da postoji neki manje „bodljikav“  način da se uradi. (Verovatno stoji u kodu, nisam gledao, sorry.)

f
[ vladab @ 28.02.2005. 16:00 ] @
Ovo je kod za obilazak (brisanje) stabla u postorderu. Treba da svaki cvor stavim na stek 2 puta. Taj cvor posecujem samo jednom, kada ga drugi put uzimam sa steka. Da bih razlikovao ta dva slucaja, stavio sam da u drugom stavljanju na stek pokazivac bude negativan. Tako su me ucili, ali u pseudo kodu. :O) Zanima me da li je ovo ispravno!