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 | 1286 (1286) | Quikee |
» | [C++ naloga] seznamOddelek: Programiranje | 1385 (1385) | BigWhale |
» | [C++] NULL: Undeclared identifier - HELP!Oddelek: Programiranje | 1221 (1159) | CCfly |
» | C++ kopirni konstruktorOddelek: Programiranje | 3419 (3150) | noraguta |
» | Ali mi lahko kdo prosim razlozi delovanje tega konstruktorjaOddelek: Programiranje | 1100 (885) | noraguta |