easyyu @ 04.07.2008. 18:37
Jednostavno se patim vec par dana nikako ne mogu da skontam gde gresim..jasno mi je da negde "ubijem adrese" u koje stvaljam podatke ali mi nije jasno gde.
Rec je o generickim pokazivacima, koje pri probi pokucavam da konvertujem u pokazivace na int!
Zadatak je DEK (deque) ali u mix-u sa stekom..znaci stvljam element na kraj leve i desne strane deka, citam sa leve i desne (sa vrha) (poslednji koji sam stavio) i isto tako sa leve i desne strane vrsim skidanje sa vrha ("smanjivanje za jedan").

Evo i koda:

Code:
#ifndef SPREGDEK_H
#define SPREGDEK_H
#include<iostream.h>
#include<conio.h>
#define MAX 5

typedef struct Elem{
    void *el;
    struct Elem *levi,*desni;
}Elem;

class Spregdek{
    Elem *lvrh,*dvrh;
public:
    Spregdek():lvrh(NULL),dvrh(NULL){}
    Spregdek(const Spregdek &);
    ~Spregdek(){lvrh=dvrh=NULL;}
    
    void PushL(void *);
    void PopL();
    void *TopL();
    
    void PushD(void *);
    void PopD();
    void *TopD();
    
    Spregdek &operator=(const Spregdek &r);
    int Empty(){
        if(lvrh==NULL&&dvrh==NULL){
            cout<<"Dek je prazan!!!n";
            return 1;
        }else return 0;
    }
};
#endif;

To je header datoteka.
Dalje..ide cpp datoteka gde definisem klasu:

Code:
#include"Spregdek.h"


//Spregdek::Spregdek(const Spregdek &r){}
void Spregdek::PushL(void *elem){
    Elem *novi=new Elem;
    if(Empty()){
        novi->el=elem;
        lvrh=dvrh=novi;
        novi->levi=NULL;
        novi->desni=NULL;
        return;
    }else{
        novi->el=elem;
        lvrh->levi=novi;
        novi->levi=NULL;
        novi->desni=lvrh;
        lvrh=novi;
        return;
    }
}

void Spregdek::PopL(){
    if(Empty()) return;
    Elem *temp=lvrh;
    if(temp->desni!=NULL){
        lvrh=lvrh->desni;
        delete temp;
        lvrh->levi=NULL;
    }else{
        if(lvrh==dvrh){
            cout<<"Ispraznio si DEK s leva nadesno!n";
            cout<<"Dalje...n";
            getche();
            return;
        }
    }
}

void *Spregdek::TopL(){
    if(Empty()) return 0;
    return lvrh->el;
}

void Spregdek::PushD(void *elem){
    Elem *novi=new Elem;
    novi->desni=NULL;
    novi->el=elem;
    if(Empty()){
        lvrh=dvrh=novi;
        novi->levi=NULL;
    }else{
        novi->levi=dvrh;
        dvrh->desni=novi;
        dvrh=novi;
    }
}

void Spregdek::PopD(){
    Elem *temp=dvrh;
    if(temp->levi!=NULL){
        dvrh=dvrh->levi;
        dvrh->desni=NULL;
        delete temp;
    }else{
        if(lvrh==dvrh){
            cout<<"Ispraznio si DEK s desna nalevo!n";
            cout<<"Dalje...n";
            getche();
            return;
        }
    }
}

void *Spregdek::TopD(){
    if(Empty()) return 0;
    return dvrh->el;
}

I evo i main deo programa koji ne znam gde gresim:

Code:
#include"Spregdek.cpp"

int main(){
    Spregdek A;
    int *niz[MAX];
    int i,j,k;
    
    cout<<"Stavljam "<<MAX<<" elemenata na levu stranu deka!n";
    for(i=j=0;i<MAX;i++,j++){
        niz[j]=&i;
        A.PushL((void*)niz[j]);//vrsim konverziju pokazivaca na int u pok na void i stavljam u niz pokacivaca niz[j]
        cout<<"Stavio sam "<<*niz[j]<<" ili ti adresa "<<(int*)A.TopL()<<endl;//*niz[j] citam elemenat sa adrese
    }
    cout<<"Dalje...n";
    getche();
    cout<<"Skidam elemente sa vrha (Top) a zatim ih brisem (Pop)n";
    for(k=0;k<MAX;k++){
        cout<<"Elelment na vrhu deka je:"<<*(int*)A.TopL()<<endl;getche();//vrsim konverziju pokazivaca na void u pokazivac na int..
        //i sa zvezdicom trazim podatak na toj adresi
        A.PopL();
    }
    getche();
}
    


Ono sto primecujem da se negde gube adrese pokazivaca koje stavljam metodom PushL.
Gde gresim?
Ako nije nekom tesko da me ispravi i napise itn main() tacno!
Inace ukoliko je privatni element u klasi Spregdek NE pok za void vec samo obican int tad mi sve lepo radi...sto znaci da je klasa lepo i ispavno definisana.
Stoga problem je samo u inr main()-u
@Moderatorima:Ako je ovo za sekciju ZA POCETNIKE..premestite temu tamo!
Hvala!
boris Dj.bl @ 05.07.2008. 00:54
Kao prvo mislim da je za genericnost bolje koristiti prave genericne klase( template <class T,...>)
Ne mogu sad gledati cijelu klasu al shvatam poentu mada sve ovo nije bas efikasno a ne vidim ni da je narocito korisno, al opet mozda se i varam.
Mozemo reci da je edukativno.

Al eto vidim i da void pokazivaci rade.
Mada je malo komplikovano zbog konverzije iz neceg u void i opet iz void u nesto (u ovom slucaju int) a to su jos pokazivaci.

U svakom slucaju sto se tice tvog pitanja moram reci da mi nije najjasnije.
Vjerujem da sam te skontao i ako je to to onda znam odgovor al nisam siguran jel to pitanje.

Ovo daje exe fajl
Code:

Stavljam 5 elemenata na levu stranu deka!nDek je prazan!!!nStavio sam 0 ili ti a
dresa 0x22ff34
Stavio sam 1 ili ti adresa 0x22ff34
Stavio sam 2 ili ti adresa 0x22ff34
Stavio sam 3 ili ti adresa 0x22ff34
Stavio sam 4 ili ti adresa 0x22ff34
Skidam elemente sa vrha (Top) a zatim ih brisem (Pop)nElelment na vrhu deka je:5

Elelment na vrhu deka je:5
Elelment na vrhu deka je:5
Elelment na vrhu deka je:5
Elelment na vrhu deka je:5
Ispraznio si DEK s leva nadesno!nDalje...n


Ako razumijem, tvoje pitanje je zasto pri izbacivanju elemenata imas sve petice a ne 5 4 3 2 1 koje su ubacio?
Onda ti odgovor lezi narednom dijelu koda
Code:

int i,j,k;
    
    cout<<"Stavljam "<<MAX<<" elemenata na levu stranu deka!n";
    for(i=j=0;i<MAX;i++,j++){
        niz[j]=&i;


Naime ti imas samo jednu promjenjljivu "i" tipa int.
Ona je prvo nula i niz[0] pokazuje na nju.
Sad "i" postaje 1 i niz[1] pokazuje opet na nju.
Zatim "i" postaje 2 i niz[2] pokazuje opet na nju.
...
...

Poenta je da na kraju "i" postane 5 a svi pointeri pokazuju na to jedno te isto "i", u ovom slucaju 5.
Tako da ti nemas 5 promjenljivih vec jednu, kojoj si ti samo mjenjao vrijednost, a svi pointeri pokazuju na tu promjenljivu.
Takodje vidim se da je to jedna promjenljiva iz adresa, koje su iste.

Ovo mozes ispraviti na dva nacina, sta mi sad pada na pamet.
Jedan je da imas niz od 5 elemenata pa da svaki pointer pokazuje na odgovarajuci element a drugi nacin je da dinamicki alociras mjesto za svaki pointer.

Samo zamjeni ovaj dio koda dio koda sa ovim

1 nacin
Code:

int i,p[MAX],j,k;
    
    cout<<"Stavljam "<<MAX<<" elemenata na levu stranu deka!n";
    for(i=j=0;i<MAX;i++,j++){ p[i]=i;
        niz[j]=&p[i];


2 nacin
Code:

    int i,j,k;
    
    cout<<"Stavljam "<<MAX<<" elemenata na levu stranu deka!n";
    for(i=j=0;i<MAX;i++,j++){
        niz[j]=new int[1]; *niz[j]=i;
easyyu @ 05.07.2008. 03:57
Zahvaljujem probacu sutra!
easyyu @ 05.07.2008. 16:47
Citat:
boris Dj.bl:

Poenta je da na kraju "i" postane 5 a svi pointeri pokazuju na to jedno te isto "i", u ovom slucaju 5.
Tako da ti nemas 5 promjenljivih vec jednu, kojoj si ti samo mjenjao vrijednost, a svi pointeri pokazuju na tu promjenljivu.
Takodje vidim se da je to jedna promjenljiva iz adresa, koje su iste.


JESTE!Upravo sam i ja to video..ali jednostavno nisam znao doci do resenja.
Prvo resenje sto si mi dao je banalno i vidi se iz aviona..ne znam kako mi nije palo napamet :(
Drugo je pak malo skrivenije..ali takodje logicno da (ako se ne varam) indirektnim adrsiranjem pokazivaca na niz dodeljujem int u *niz[j]
Prijatelju..punoooo ti hvala ustedio si mi vreme..
Probao oba resenja i oba rade!
thx.
easyyu @ 05.07.2008. 16:49
Citat:
boris Dj.bl: Kao prvo mislim da je za genericnost bolje koristiti prave genericne klase( template <class T,...>)
Ne mogu sad gledati cijelu klasu al shvatam poentu mada sve ovo nije bas efikasno a ne vidim ni da je narocito korisno, al opet mozda se i varam.
Mozemo reci da je edukativno.


Da jeste edukativno..posto se ovo trazi na ispitu..i gledaju koliko shvatas materju..pokazivace..njihovu konverziju..klase..nasledjivanje i ostalo!