Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

zašto?!
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++)
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Gost






PostPostano: 16:12 pon, 6. 10. 2003    Naslov: zašto?! Citirajte i odgovorite

Zašto ovaj program ne funkcionira kada se while petlja okrene više od tri puta?!

[code:1]#include <iostream>
using namespace std;


void funkcija(int &ref){
ref+=10;
}
int main(){
cout<<"upisi broj"<<endl;
int n;
cin>>n;
int vel_polja0=1,vel_polja1=1;
vel_polja0+=2*(n/2);
int *polje0=new int[vel_polja0];
int br_clanova_sume=3;
vel_polja1+=vel_polja0+10;
int *polje1= new int[vel_polja1];
int &ref0=vel_polja0,&ref1=vel_polja1;
while(br_clanova_sume<=n){
if(br_clanova_sume%2==1){
int *polje1=new int[vel_polja1];
*polje1=12;
vel_polja0+=10;
ref=1;
funkcija(ref);
delete []polje0;
}else{
int *polje0=new int[vel_polja0];
*polje0=12;
vel_polja1+=10;
ref=1;
funkcija(ref);
delete []polje1;
}
br_clanova_sume+=1;
}
if(br_clanova_sume%2==1){
delete []polje0;
}else{
delete []polje1;}
return 0;
}[/code:1]
Zašto ovaj program ne funkcionira kada se while petlja okrene više od tri puta?!

Kod:
#include <iostream>
using namespace std;


void funkcija(int &ref){
  ref+=10;
}
int main(){
   cout<<"upisi broj"<<endl;
   int n;
   cin>>n;
   int vel_polja0=1,vel_polja1=1;
   vel_polja0+=2*(n/2);
   int *polje0=new int[vel_polja0];
   int br_clanova_sume=3;
   vel_polja1+=vel_polja0+10;
   int *polje1= new int[vel_polja1];
   int &ref0=vel_polja0,&ref1=vel_polja1;
   while(br_clanova_sume<=n){
      if(br_clanova_sume%2==1){
         int *polje1=new int[vel_polja1];
       *polje1=12;
       vel_polja0+=10;
       ref=1;
       funkcija(ref);
       delete []polje0;
        }else{
        int *polje0=new int[vel_polja0];
        *polje0=12;
        vel_polja1+=10;
        ref=1;
        funkcija(ref);
        delete []polje1;
      }
      br_clanova_sume+=1;
   }
   if(br_clanova_sume%2==1){
        delete []polje0;
   }else{
      delete []polje1;}
    return 0;
}


[Vrh]
Gost






PostPostano: 16:15 pon, 6. 10. 2003    Naslov: Citirajte i odgovorite

Ispričavam se gore je bila greška pa evo opet isto pitanje za ovaj kod.

[code:1]#include <iostream>
using namespace std;


void funkcija(int &ref){
ref+=10;
}
int main(){
cout<<"upisi broj"<<endl;
int n;
cin>>n;
int vel_polja0=1,vel_polja1=1;
vel_polja0+=2*(n/2);
int *polje0=new int[vel_polja0];
int br_clanova_sume=3;
vel_polja1+=vel_polja0+10;
int *polje1= new int[vel_polja1];
int &ref0=vel_polja0,&ref1=vel_polja1;
while(br_clanova_sume<=n){
if(br_clanova_sume%2==1){
int *polje1=new int[vel_polja1];
*polje1=12;
vel_polja0+=10;
ref0=1;
funkcija(ref0);
delete []polje0;
}else{
int *polje0=new int[vel_polja0];
*polje0=12;
vel_polja1+=10;
ref1=1;
funkcija(ref1);
delete []polje1;
}
br_clanova_sume+=1;
}
if(br_clanova_sume%2==1){
delete []polje0;
}else{
delete []polje1;}
return 0;
}[/code:1]
Ispričavam se gore je bila greška pa evo opet isto pitanje za ovaj kod.

Kod:
#include <iostream>
using namespace std;


void funkcija(int &ref){
  ref+=10;
}
int main(){
   cout<<"upisi broj"<<endl;
   int n;
   cin>>n;
   int vel_polja0=1,vel_polja1=1;
   vel_polja0+=2*(n/2);
   int *polje0=new int[vel_polja0];
   int br_clanova_sume=3;
   vel_polja1+=vel_polja0+10;
   int *polje1= new int[vel_polja1];
   int &ref0=vel_polja0,&ref1=vel_polja1;
   while(br_clanova_sume<=n){
      if(br_clanova_sume%2==1){
         int *polje1=new int[vel_polja1];
       *polje1=12;
       vel_polja0+=10;
       ref0=1;
       funkcija(ref0);
       delete []polje0;
        }else{
        int *polje0=new int[vel_polja0];
        *polje0=12;
        vel_polja1+=10;
        ref1=1;
        funkcija(ref1);
        delete []polje1;
      }
      br_clanova_sume+=1;
   }
   if(br_clanova_sume%2==1){
        delete []polje0;
   }else{
      delete []polje1;}
    return 0;
}


[Vrh]
Matko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 15. 06. 2003. (01:56:38)
Postovi: (57)16
Sarma = la pohva - posuda
= 10 - 2

PostPostano: 0:41 ned, 12. 10. 2003    Naslov: Citirajte i odgovorite

Razlog zasto gornji program ne radi jest kako slijedi.
Unutar bloka koji pripada funkciji main postoje dva int pointera polje0 i polje1 koji u startu pokazuju na neke dinamicki alocirane komade memorije. Pretpostavljam da je zamisljeno da bi se unutar bloka koji pripada if-ovima u while petlji naizmjence trebala alocirati memorija za jedan od pointera polje0 ili polje1, dok bi se za onaj drugi prethodno alocirana memorija oslobodila. No, problem je u tome sto se unutar tih if-blokova deklariravaju lokalni int pointeri polje1 odnosno polje0, koji nakon izlaska iz bloka vise ne postoje, a alocirana memorija na koju su oni pokazivali ostane negdje visiti. Pozivi delete operatora pak oslobadjaju memoriju na koju pokazuju "globalniji" (tj. oni koji pripadaju main-u) pointeri polje0 i polje1. Nakon provedene dealokacije memorije ti pointeri ne pokazuju vise ni na nista smislenog, pa ponovni poziv delete-a na te iste pointere je kvalitetan razlog da dolazi do "rusenja" programa.

Ono sto bi trebalo promijeniti da program radi jest izbaciti deklaraciju lokalnih pointera polje0 i polje1 unutar if-blokova i ostaviti samo njihovu inicijalizaciju.
Dakle, umjesto:
[code:1]int *polje0=new int[vel_polja0];[/code:1]
neka pise:
[code:1]polje0=new int[vel_polja0];[/code:1]
Razlog zasto gornji program ne radi jest kako slijedi.
Unutar bloka koji pripada funkciji main postoje dva int pointera polje0 i polje1 koji u startu pokazuju na neke dinamicki alocirane komade memorije. Pretpostavljam da je zamisljeno da bi se unutar bloka koji pripada if-ovima u while petlji naizmjence trebala alocirati memorija za jedan od pointera polje0 ili polje1, dok bi se za onaj drugi prethodno alocirana memorija oslobodila. No, problem je u tome sto se unutar tih if-blokova deklariravaju lokalni int pointeri polje1 odnosno polje0, koji nakon izlaska iz bloka vise ne postoje, a alocirana memorija na koju su oni pokazivali ostane negdje visiti. Pozivi delete operatora pak oslobadjaju memoriju na koju pokazuju "globalniji" (tj. oni koji pripadaju main-u) pointeri polje0 i polje1. Nakon provedene dealokacije memorije ti pointeri ne pokazuju vise ni na nista smislenog, pa ponovni poziv delete-a na te iste pointere je kvalitetan razlog da dolazi do "rusenja" programa.

Ono sto bi trebalo promijeniti da program radi jest izbaciti deklaraciju lokalnih pointera polje0 i polje1 unutar if-blokova i ostaviti samo njihovu inicijalizaciju.
Dakle, umjesto:
Kod:
int *polje0=new int[vel_polja0];

neka pise:
Kod:
polje0=new int[vel_polja0];


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++) Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan