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

Problem oko programa... (c++ microsoft visual studio 2005)

[es] :: C/C++ programiranje :: Problem oko programa... (c++ microsoft visual studio 2005)

[ Pregleda: 2805 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

posetilac-

Član broj: 39657
Poruke: 6
89.216.223.*



Profil

icon Problem oko programa... (c++ microsoft visual studio 2005)30.09.2008. u 18:32 - pre 189 meseci
http://rapidshare.com/files/149732285/DomaciZadatak.rar.html
Na ovoj adresi sam uploadovao taj moj zadatak.... Uglavnom lupam glavu sta nije uredu vec 2 dana .... sintaksa je uredu (kompajler ne prijavljuje gresku) , dok ocigledno je da postoji greska u memoriji.....
Molim za pomoc , u kometrare (u glavni.cpp) sam stavio sta je problem...Samo da se razumemo taj program nije potpun ,(ima jos stvari koje zadatak trazi) ali ne mogu da nastavim dalje bez da otkrijem sta nije uredu s sadashnjim stanjem programa....
Hvala unapred...
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)30.09.2008. u 19:07 - pre 189 meseci
Ima gresaka, samo da pomenem neke:

1. Projektni fajl je los jer nema ukljucene opcije za generisanje podataka za debagovanje pa tako sama aplikacija ne moze da se debaguje.
2. Prva greska:

Code:

//Zbirka.cpp
void Zbirka::obrisi_tek()
{
    delete niz[tek]; ///Zasto se ovo brise na ovaj nacin? Kako znas da je niz inicijalizovan ispravno (a nije zato i puca)?
    for(int i=tek;i<n-1;i++)
    {
        niz[i]=niz[i+1];
    }
    niz[n-1]=NULL;
    n--;
}


3. Druga greska:
Code:

//Ovde opet ista stvar. Kako znas da je niz ispravno inicijalizovan? Sta se desava ako nije? (naravno access violation)
void Zbirka::brisi()
{
    for(int i=0;i<n;i++)
    {
        delete niz[i]; 
        niz[i]=0;
    }
    delete [] niz;
    niz=0;
}



Tko leti vrijedi
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
87.250.42.173



+1064 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)30.09.2008. u 19:28 - pre 189 meseci
Tesko da ce moci da zna dal je niz ispravno inicijalizovan na tom mestu, nego jedino sto
vidim tu da ne valja je to sto se 'tek' ne proverava sa assert(tek>=0 && tek<n);
ili slicno i sto 'tek' nije ulazni parametar f-je nego se setuje na nekom drugom mestu.
U stvari ne vidim svrhu ove f-je jel to treba da obrise neki element niza?

Ostalo je ok pod pretpostavkom da je sve inicijalizovano kako treba.

Pozdrav!

edit: eh da u drugoj f-ji zaboravio je da resetuje n.

edit2: jos fali i provera dal je niz prazan na pocetku, tj dal je n == 0 ;)



[Ovu poruku je menjao Branimir Maksimovic dana 30.09.2008. u 20:49 GMT+1]

[Ovu poruku je menjao Branimir Maksimovic dana 30.09.2008. u 20:49 GMT+1]
 
Odgovor na temu

posetilac-

Član broj: 39657
Poruke: 6
*.dynamic.sbb.rs.



Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)06.10.2008. u 18:22 - pre 189 meseci
evo ovako ..... znam da je problem to da mi "puca program" kod metode "void Zbirka::brisi()" ... ali mi nije jasno zbog cega...
Evo sad sam prekucao projekat i sada je moguce pokrenuti debugger.... ja ne znam da s njim rukovodim kako treba, samo znam da mi on pokazuje da program "zakuca" na metodi "void Zbirka::brisi()" .... ali ne razumem zbog cega.

Zamolio bih nekog da mi prepravi program tako da radi ...... evo uploadovao sam ga ponovo na ovoj adresi : http://rapidshare.com/files/151487087/Domaci_Zadatak.rar.html
Ako nekog zanima postavka zadatka -> http://kondor.etf.bg.ac.yu/%7E...ektno_prog/domaci/2007_08.html
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p1-10.BVCOM.NET.



+1064 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)06.10.2008. u 20:34 - pre 189 meseci
Ako ti se zakucava u brisi to znaci da ti ne valja n. Taj n ni ne resetujes na 0,
pa ako pozoves brisi dvaput nece valjati jer si i ceo niz obrisao.

Zaista nemam vremena da downloadujem tvoj kod, sorry.

Pozdrav!

edit: ah koliko gramatickih gresaka u jednoj mojoj recenici ;)
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)06.10.2008. u 20:57 - pre 189 meseci
Problem je sto previse tj.nepotrebno koristis funkciju "brisi()" u tvojim u destruktorima klasa kada je brises sa delete niz[ i ] i niz ..
Evo na primeru (namerno sam ti stavio cout komandu da vidis u konzoli kojim se redom pozivaju destruktori tvojih nasledjenih klasa
a metodu brisanje sam iskomentarisao da bi ti program radio ..
Code:

~Skladiste()
{
     cout << "Brisanje skladista" << "r\n" ;
     //brisi();
}

~UredjenaZbirka()
{
  cout << "Brisanje uredjene zbirke" << "r\n" ;
   //brisi();
}

~Zbirka()
{
    cout << "Brisanje zbirke" << "r\n" ;
    brisi();
    system("pause") ;
}


I druga stvar sto je veoma losa praksa a i ostali su ti napomenulu je da nigde ne proveravas
da li je niz inicijalizovan tj. da li njegov clan ima ispravan pointer,
kao i to da kada uradis delete niz[tek] ili delete niz obavezno ga postavi na nulu pre brisanja celog niza :

Code:
 
if (niz[tek] != 0) {
  delete niz[tek] ; 
  niz[tek] = 0 ; 
}




Viva lollapalooza
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p1-10.BVCOM.NET.



+1064 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)06.10.2008. u 21:05 - pre 189 meseci
Ma na osnovu koda koji si postovao i ostali, vec sam mu rekao sta je problem.
Ne resetuje n na 0 pa ne moze da pozove brisi dvaput. Sve ostalo je ok.

Drugo ne mozes nikako proveriti dal je pointer ispravan ili ne jer
svi pointeri su ispravni, a ko samo povuces vrednost
pointera koji ne pokazuje na nesto alocirano, to je ub.

Trece nema potrebe da proverava dal je pointer != 0 jer delete null pointera
je garantovano no op.

Pozdrav!

 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)06.10.2008. u 21:51 - pre 189 meseci
Citat:

Trece nema potrebe da proverava dal je pointer != 0 jer delete null pointera
je garantovano no op.
Pozdrav!

Jesi siguran ? Evo kako to izgleda tj. testirano na VC++ 8.0 compileru u debug modu


Code:

delete niz[tek]; // kad se uradi delete pointer ostaje njegova adresa ali heap na koji pokazuje je neispravan tj. oxfeeefeee
niz[tek] = 0; resetujes pointer 
delete niz[tek];  // ovde vec ne puca .. 

i
Code:
 
delete niz[tek];
// u sledecem prolazu kroz niz 
delete niz[tek]; //ovde puca 



Tako da kad se pozove :
Code:
 
if (niz[tek] != 0) {
  delete niz[tek] ; 
  niz[tek] = 0 ; 
}


Moze biti siguran da je pointer ispravan za brisanje i ne mora da radi bespotrebno delete na 0p.


Citat:

Ma na osnovu koda koji si postovao i ostali, vec sam mu rekao sta je problem.
Ne resetuje n na 0 pa ne moze da pozove brisi dvaput. Sve ostalo je ok.


Da to sam i ja prvo primetio da izmedju ostalog i variajbla N koja se ne postavlja na 0
ali sto bi ponovo pozivao istu funkciju vise puta
Code:

void brisi () 
{
for(int i=0;i<n;i++)
{
    delete niz[i];
}
delete [] niz;

  n=0; ovde  je izostavio 
}


pa i da resetuje N na nulu kad moze da je kontrolise kroz destruktore klasa
jednom i samo jednom ili na ovaj nacin :
Code:
 
~Skladiste()
{
     cout << "Brisanje skladista" << "r\n" ;
     if (n > 0) 
        brisi();
}





E sad na njemu je da je po potrebi pozove u odgovarajucoj klasi...

Pozdrav!


Viva lollapalooza
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p1-10.BVCOM.NET.



+1064 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)06.10.2008. u 22:09 - pre 189 meseci
Pazi prvo pitanje na c++ usenet grupama onih koji uce je da li moraju
da provere pointer na null pre delete, evo ti iz faq-a:

http://www.parashift.com/c++-f...e/freestore-mgmt.html#faq-16.8

Kad kazas if(p != 0) to ti ne govori da li je pointer ispravan za brisanje.
Ukoliko je pointer prethodno obrisan ili nije inicijalizovan
a posle toga proveris dal je nula, to je undefined behavior.

Pozdrav!

edit: da bi me razumeo, dakle nakon brisanja pointer se obavezno inicijalizuje
sa 0 ili odmah sa nekom drugom vrednoscu koja pokazuje na validno alocirani
objekt, naravno ukoliko ima potrebe da se dalje koristi.


[Ovu poruku je menjao Branimir Maksimovic dana 06.10.2008. u 23:23 GMT+1]
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: Problem oko programa... (c++ microsoft visual studio 2005)06.10.2008. u 23:07 - pre 189 meseci
Kad kazem:
Code:
 
delete niz[tek] ; 
niz[tek] =0; 

brise se memorija i pointer je deinicijalizovan i mogu bez problema da ga proveravam na 0 ;)
a kad kazem :
Code:
 
delete niz[tek] ; // ovaj delete ne postavlja pointer niz[tek] automatski na 0; 
// pa posle negde 
if (niz[tek] != 0) 
  delete niz[tek] ; // puca

Zato ga i ne preporucuju , ali ako se uzme u obzir da ide niz[tek] =0 (to nigde ne pise na usenet grupi) posle delete niz[tek]
onda i nema potrebe za dodatnim if uslovom jer delete na 0 pointer ne radi nista.

EDIT :
E sad videh tvoj edit :)
Bitno je da smo se razumeli
Pozdrav !

Viva lollapalooza
 
Odgovor na temu

[es] :: C/C++ programiranje :: Problem oko programa... (c++ microsoft visual studio 2005)

[ Pregleda: 2805 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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