Forum » Programiranje » pomoc pri skladu
pomoc pri skladu
zavger ::
Pozdravljeni!!
Narjprej bi se rad upravicil zaradi moje teme, ampak ta stvar mi ze resnicno greni zivljenje, zato prosim za pomoc.
Zadeva:
Napisal sem sklad vse lepo deluje (vsaj mislim tako), napaka se pojavi ko klicem kopirni konstruktor,
sicer mi objekt skopira, ampak ob zakljucko programa mi javi napako. (da lahk neka poslem microsoftu)
Upam da si bo gdo vzel cas in pogledal kaj je narobe.
Za morebitno resitev bom vecno hvalezen!
Prilagajam se kodo:
[edit: oblikoval sem kodo - Gundolf]
Narjprej bi se rad upravicil zaradi moje teme, ampak ta stvar mi ze resnicno greni zivljenje, zato prosim za pomoc.
Zadeva:
Napisal sem sklad vse lepo deluje (vsaj mislim tako), napaka se pojavi ko klicem kopirni konstruktor,
sicer mi objekt skopira, ampak ob zakljucko programa mi javi napako. (da lahk neka poslem microsoftu)
Upam da si bo gdo vzel cas in pogledal kaj je narobe.
Za morebitno resitev bom vecno hvalezen!
Prilagajam se kodo:
// razred vozlisce
class vozlisce
{
public:
// konstruktorji
vozlisce(int pod)
{
podatek=pod;
k_naslednji=NULL;
}
vozlisce(int pod,vozlisce* next)
{
podatek=pod;
k_naslednji=next;
}
// kopirni konstruktor
vozlisce(const vozlisce& voz)
{
podatek=voz.podatek;
k_naslednji=voz.k_naslednji;
}
// destruktor
~vozlisce(){};
// vrni podatek
int VrniPodatek() {return podatek;}
// spremeni podatek
void SpremeniPodatek(int p) {podatek=p;}
// vrni naslednjega
vozlisce* VrniNaslednjega() {return k_naslednji;}
// spremeni naslednjega
void SpremeniNaslednjega(vozlisce* next) {k_naslednji=next;}
protected:
int podatek; // podatek
vozlisce* k_naslednji; // kazalec na naslednje vozlisce
};
// razred sklad
class sklad
{
public:
sklad();
sklad(const sklad& skl);
~sklad();
void Vstavi(int v);
void Brisi();
int Vrh() const {return k_vrh->VrniPodatek();}
bool Prazno() const {if(k_vrh==NULL)return true;
else return false;}
int Velikost() const {return stevec;}
protected:
vozlisce* k_vrh; // kazalec na vrh sklada
int stevec; // stevilo elementov sklada
};
sklad::sklad()
:k_vrh(NULL),stevec(0)
{
}
sklad::sklad(const sklad& skl)
{
vozlisce* k=skl.k_vrh;
stevec=skl.stevec;
while(k!=NULL)
{
this->Vstavi(k->VrniPodatek());
k=k->VrniNaslednjega();
}
}
sklad::~sklad()
{
while(k_vrh!=NULL)
{
Brisi();
}
}
// vstavljanje na sklad
void sklad::Vstavi(int v)
{
// povecamo stevec
stevec++;
// vstavljanje prvega elementa
if(Prazno()==true)
{
vozlisce* novi=new vozlisce(v);
k_vrh=novi;
return;
}
// vstavljanje vseh ostalih elementov
vozlisce* novi=new vozlisce(v,k_vrh);
k_vrh=novi;
}
// brisanje elementov
void sklad::Brisi()
{
if(Prazno()!=true)
{
vozlisce* pomozni=k_vrh;
k_vrh=k_vrh->VrniNaslednjega();
delete pomozni;
stevec--;
return;
}
else
..............
}
int main()
{
sklad a;
a.Vstavi(14);
// napaka
sklad b(a);
cin.get();
return 0;
}
[edit: oblikoval sem kodo - Gundolf]
zavger
- spremenil: Gundolf ()
NoUse4AName ::
V kopirnem konstruktorju vidim dve napaki
- ti nikjer ne postavis k_vrh.
- podatke prekopiras v obratnem vrstnem redu. To kar je na vrhu sklada od katerega kopiras, bo na dnu sklada v tistega katerega kopiras.
- ti nikjer ne postavis k_vrh.
- podatke prekopiras v obratnem vrstnem redu. To kar je na vrhu sklada od katerega kopiras, bo na dnu sklada v tistega katerega kopiras.
zavger ::
A bi mi lahk bolj konkretno pomagal.
Kar sem probal zmeraj mi javi napako al pa okno zamrzne - kaj to pomeni;
Kar sem probal zmeraj mi javi napako al pa okno zamrzne - kaj to pomeni;
zavger
Gundolf ::
To da ti tako sporočilo o napaki pokaže pomeni da si nekaj 'zasral' s pointerji. Mislim da ti je tu NoUse4AName kar konkretno namignil kje je problem.
Če sam nahitro pogledam je problem verjetno sledeč: Sklada pri kopirnem konstruktorju ne kopiraš, le kopijo nastaviš da 'kaže' na isti sklad kot original. Ko pobrišeš original (to se zgodi ob izhodu iz programa) si s tem uničiš kopijo. In ko poskuša program uničiti še kopijo pride zato do napake (ker sklada enostavno ni več).
Poskusi se naučiti uporabljati debugger.
Če sam nahitro pogledam je problem verjetno sledeč: Sklada pri kopirnem konstruktorju ne kopiraš, le kopijo nastaviš da 'kaže' na isti sklad kot original. Ko pobrišeš original (to se zgodi ob izhodu iz programa) si s tem uničiš kopijo. In ko poskuša program uničiti še kopijo pride zato do napake (ker sklada enostavno ni več).
Poskusi se naučiti uporabljati debugger.
Vredno ogleda ...
| Tema | Ogledi | Zadnje sporočilo | |
|---|---|---|---|
| Tema | Ogledi | Zadnje sporočilo | |
| » | [C++] Linker errorOddelek: Programiranje | 1407 (1407) | Quikee |
| » | [C++ naloga] seznamOddelek: Programiranje | 1512 (1512) | BigWhale |
| » | [C++] NULL: Undeclared identifier - HELP!Oddelek: Programiranje | 1354 (1292) | CCfly |
| » | C++ kopirni konstruktorOddelek: Programiranje | 3622 (3353) | noraguta |
| » | Ali mi lahko kdo prosim razlozi delovanje tega konstruktorjaOddelek: Programiranje | 1209 (994) | noraguta |