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

problem sa pokazivacima

[es] :: C/C++ programiranje :: C/C++ za početnike :: problem sa pokazivacima

[ Pregleda: 3903 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
*.DIALUP-SMIN.neobee.net.



Profil

icon problem sa pokazivacima27.02.2007. u 21:00 - pre 208 meseci
EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]

Tako uokviren (formatizovan) kod će se videti ovako:

Code:

int main ( int argc, char *argv[] )
{
   // ...
   return 0;
}


zasto nece da radi ako definisem Position *pok,a radi za Position pok?


ovo radi:
Code:

#include <iostream.h>

class Position {
    int x, y;
  public:
    Position();
    Position(Position& );
    void set(int new_x, int new_y);
    void get(int* current_x, int* current_y); 
};

Position::Position()
{
    x = 0;
    y = 0; 
}


void 
Position::set(int new_x, int new_y)
{
    x = new_x;
    y = new_y; 
}

void 
Position::get(int* current_x, int* current_y)
{
    *current_x = x;
    *current_y = y; 
}

Position
position;

void
position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}

int
main()
{
    int x, y;
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
    position.set(5,7);
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";

   Position pok;    
    position_input(&pok);
    pok.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
   

}


a ovo ne:

#include <iostream.h>

class Position {
    int x, y;
  public:
    Position();
    Position(Position& );
    void set(int new_x, int new_y);
    void get(int* current_x, int* current_y); 
};

Position::Position()
{
    x = 0;
    y = 0; 
}


void 
Position::set(int new_x, int new_y)
{
    x = new_x;
    y = new_y; 
}

void 
Position::get(int* current_x, int* current_y)
{
    *current_x = x;
    *current_y = y; 
}

Position
position;

void
position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}

int
main()
{
    int x, y;
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
    position.set(5,7);
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";

  
    Position* pok;    
    position_input(pok);
    pok->get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
   

}


[Ovu poruku je menjao X Files dana 28.02.2007. u 07:25 GMT+1]
 
Odgovor na temu

radoica

Član broj: 12972
Poruke: 158
*.yubc.net.



+3 Profil

icon Re: problem sa pokazivacima27.02.2007. u 23:20 - pre 208 meseci
Mozda ovo nedostaje

Code:
Position* pok = new Position();


p.s. stavi kod u code tagove, ovako je bas tesko za citanje!
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
212.200.179.*



Profil

icon Re: problem sa pokazivacima02.03.2007. u 17:02 - pre 208 meseci
Radoice,ovo resava stvar!
jel bi mogao samo malo da mi objasnis zasto je to neophodno?
hvala ti !

@X Files
hvala za sredjivanje posta;)
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.18.eunet.yu.



+1 Profil

icon Re: problem sa pokazivacima02.03.2007. u 18:29 - pre 208 meseci
Svrha new operatora je da rezervishe prostor u memoriji za objekat. Uzmi bilo koju knjigu o C++ i prouchi kako se radi sa pokazivachima i memorijom.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
212.200.179.*



Profil

icon Re: problem sa pokazivacima02.03.2007. u 19:21 - pre 208 meseci
znam da je new za rezervisanje prostora u dinamickoj memoriji,ali zar ne mozemo samo da definisemo pokazivac,zasto moramo da uvodimo dinamicku memoriju u igru?
 
Odgovor na temu

SuPeR_MaSteR
Marko Stamenković

Član broj: 88590
Poruke: 115
212.200.29.*



Profil

icon Re: problem sa pokazivacima02.03.2007. u 20:44 - pre 208 meseci
Pa mora da se uvodi dinamicka memorija u igru jer je pokazivac samo tip podataka koji pokazuje na neki objekt u memoriji tako sto sadrzi njegovu adresu, a da bi radio sa slobodnim prostorom u memoriji neophodna je alokacija.
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
*.dialup.neobee.net.



Profil

icon Re: problem sa pokazivacima02.03.2007. u 21:10 - pre 208 meseci
Jednostavno ne razumem zasto nije moguce samo napisati
Pokazivac* pok;
vec mora
Pokazivac* pok = new Pokazivac();
Zasto moram da alociram memoriju?Kada uopste vrsimo alociranje memorije operatorom new?
Kontam da je ovo za neke od vas verovatno banalno,al mene zbunjuje:(.Moze li malo pojasnjenja?
Hvala!
 
Odgovor na temu

lucky

Član broj: 2032
Poruke: 57
..AT.HighSpeedADSL.beotel.net.

Jabber: lucky@elitesecurity.org


+1 Profil

icon Re: problem sa pokazivacima02.03.2007. u 22:47 - pre 208 meseci
Pa recimo ovako, resio si da se provozas, ali nemas kola, a hteo bi bas svojim kolima da se provozas. Pozoves lepo CZ i narucis Yuga, pa oni ga naprave i posalju i kad ti isti stigne mozes da se vozas do mile volje, pod uslovom da sipas gorivo.
Yugo *moj = new Yugo();
Znaci, imas auto, mozes da se vozis.

Pokazivac se i zove tako zato sto pokazuje na neku dinamicku promenljivu. Ako ne rezervises prostor u memoriji za tu promenljivu jednostavno ne mozes da je koristis, jer nigde ne postoji.
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.103.eunet.yu.



+1 Profil

icon Re: problem sa pokazivacima03.03.2007. u 01:14 - pre 208 meseci
Pokazivač pokazuje na neki deo memorije ali ne garantuje da taj deo memorije nije zauzet, možda se na tom mestu već nalazi neki podatak. Ako želish da smestiš svoj podatak na neko mesto u memoriji, onda moraš da obezbediš parče memorije za taj podatak. To obezbeđivanje se radi preko new.
Dakle,
Code:

Klasa obj;

automatski obezbeđuje memoriju za smeštanje objekta obj, dok
Code:

Klasa* obj;

ne.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
212.200.179.*



Profil

icon Re: problem sa pokazivacima03.03.2007. u 18:12 - pre 208 meseci
znaci,u gornjem primeru,posto smestam podatke u pokazivac neophodno je alocirati memoriju,"samo" je smestanje u pitanju???

a postoje li situacije kada mozemo koristiti samo

Code:
Klasa* pokazivac
Jel moze neki primer?

 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.adsl-1.sezampro.yu.



+4 Profil

icon Re: problem sa pokazivacima03.03.2007. u 19:32 - pre 208 meseci
Citat:
VukSta:
a postoje li situacije kada mozemo koristiti samo
Code:
Klasa* pokazivac
Jel moze neki primer?

Možeš da koristiš kada deklarišeš pointer na objekat tipa te-i-te klase,kako bi
ga kasnije alocirao sa new (npr. kod pravljenja objekata u petlji,stavljanja u niz itd.):
Code:

Klasa* pokazivac;
for (i=0;i<1;i++) {
pokazivac = new Klasa;
pokazivac->NekaMetoda();
delete pokazivac;
                       }


Sa:
Code:

Klasa *pokazivac;

deklarišeš pointer na objekat neke klase,sa
Code:

Klasa pokazivac;

alociraš objekat na stack-u,
a sa
Code:

Position* pok = new Position();

na heap-u. Stek i heap (eng. gomila) su različite lokacije u memoriji,vidi ovde:
http://en.wikipedia.org/wiki/Stack-based_memory_allocation
http://en.wikipedia.org/wiki/Heap-Based_Memory_Allocation


Ag + Na -> Xe
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.19.eunet.yu.



+1 Profil

icon Re: problem sa pokazivacima03.03.2007. u 23:39 - pre 208 meseci
Recimo imaš funkciju koja treba da obradi objekat neke klase. Ako je objekat veliki, onda je bolje prihvatiti pokazivač na taj objekat da bi uštedeo memoriju. Tada umesto
Code:
void f(Klasa obj)
napraviš funkciju
Code:
void f(Klasa* obj);
i radiš sa pokazivačem na taj objekat umesto sa samim objektom. Ovo se naravno može uraditi i preko referenci u C++ ali u C-u bi morao da koristiš pokazivač.
Zatim, u kontejnerskim klasama C++ biblioteke imaš iteratore koji su uopštenje pokazivača i sintaksa im je slična. Oni se koriste za rad sa objektima smeštenim u kontejner. Kasnije ćeš stići do toga i videti koliko je to zgodan pristup.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
212.200.179.*



Profil

icon Re: problem sa pokazivacima04.03.2007. u 19:56 - pre 208 meseci
znaci kad god radim sa pokazivacima,moram da alociram memoriju?
mene je to zbunjivalo,zbog toga sto sam naletao na primere u C-u kada se samo definise pokazivac bez alokacije,npr
Code:

int* a;

tu npr,ne alociram memoriju...
kada moram da alociram memoriju,jel uvek??
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.21.eunet.yu.



+1 Profil

icon Re: problem sa pokazivacima04.03.2007. u 22:15 - pre 208 meseci
Ne. Pokazivach kao shto mu ime kazze pokazuje na neki objekat. Pokazivach uzima vrednost adrese nekog objekta. Stavi npr.
Code:

int n = 1;
int* p;
p = &n;

Ovde p uzima vrednost adrese broja n tj. pokazuje na objekat n. Ako uradish
Code:
cout << *p << endl;
, onda ccesh ispisati vrednost broja n. Zashto? Zato shto je pokazivach uzeo memorijsku adresu broja n i pokazuje na sadrzzaj promenljive n. Ako uradish
Code:
*p = 2;
, onda ccesh promeniti vrednost na toj adresi, tj. promeniccesh vrednost na koju pokazuje p tj. promeniccesh vrednost broja n. To mozzesh da proverish opet sa
Code:
cout << *p << endl;

Dakle, pokazivach mozze da pokazuje na vecc postojecci objekat ili mozzesh da napravish novi (sa new) i da pokazivach pokazuje na taj novoformirani objekat.
Najbolje josh jednom prochitaj u knjizi odeljak o pokazivachima (pointerima), pa onda nastavi sa operatorom new.


Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
80.74.160.*



Profil

icon Re: problem sa pokazivacima06.03.2007. u 20:14 - pre 208 meseci
da,razumeo sam o cemu se radi.Hvala na iscrpnim objasnjenjima!
samo jos jedno pitanje:
sta se onda zapravo desi kada uradim:

Code:

void
position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}

Position* pok;   
 
position_input(pok);

jel se negde upisuje sadrzaj ili ne?
hvala jos jednom!
necu vas vise smarati sa ovim;)
 
Odgovor na temu

SuPeR_MaSteR
Marko Stamenković

Član broj: 88590
Poruke: 115
*.inffo.net.



Profil

icon Re: problem sa pokazivacima06.03.2007. u 21:20 - pre 208 meseci
Upisuje se sadrzaj, funkcija position_input() stvara bocne efekte.
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
80.74.160.*



Profil

icon Re: problem sa pokazivacima06.03.2007. u 21:48 - pre 208 meseci
Code:
 
  void get(int* current_x, int* current_y)
{
    *current_x = x;
    *current_y = y; 
}
 
void position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}



    Position* pok ;    
    position_input(pok);
    pok->get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    

znaci upise ,ali ne moze da se dohvati sa get?zasto to ako se vec upise negde?jel nije definisano to "negde" ili sta?
 
Odgovor na temu

SuPeR_MaSteR
Marko Stamenković

Član broj: 88590
Poruke: 115
*.inffo.net.



Profil

icon Re: problem sa pokazivacima06.03.2007. u 22:20 - pre 208 meseci
Mislim da je problem sto si sadrzaju pokazivaca current_x i current_y dodeljivao adrese pokazivaca x i y, prepravi ovako pa probaj:
Code:

void get(int* current_x, int* current_y)
{
    *current_x = *x;
    *current_y = *y; 
}

 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.160.eunet.yu.



+1 Profil

icon Re: problem sa pokazivacima06.03.2007. u 22:23 - pre 208 meseci
Pozivash position_input() za pok koji pokazuje negde bezveze jer nisi rezervisao memoriju sa new. To znachi da je pok tzv. lutajucci pokazivach. Program mozze da pukne posle 5 minuta a mozze i posle 5 meseci, jer nikada ne znash u koji deo memorije si pisao. Za get() ne vidim da je definisana za klasu Position pa ne razumem kako je pozivash za pok.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

VukSta
Vuk Stankovic
Novi Sad

Član broj: 102879
Poruke: 33
80.74.160.*



Profil

icon Re: problem sa pokazivacima06.03.2007. u 22:27 - pre 208 meseci
sada sam i to razjasnio,hvala vam,vise vas necu smarati,bar sto se ovoga tice:)
hvala jos jednom!
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: problem sa pokazivacima

[ Pregleda: 3903 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

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