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

Pokazivac na klasu!?!

[es] :: Pascal / Delphi / Kylix :: Pokazivac na klasu!?!

[ Pregleda: 3925 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.7.eunet.yu.



Profil

icon Pokazivac na klasu!?!09.01.2005. u 18:01 - pre 234 meseci
Imam klasu TGame i TPawn.
Konstruktor za TPawn izgleda ovako:
Code:

TPawn.Create(game: PTGame);
begin
  ...
  myGame:=game;
  ...
end;


gde je PTGame = ^TGame,
a myGame: PTGame polje klase TPawn.
TGame ima polje board tipa PTBoard = ^TBoard, kao i pawn: PTPawn = ^TPawn.

Pri pozivanju funkcije myGame.board.funkcija iz neke od metoda klase TPawn, javlja se greska EAccessViolation.

Pre nego sto se poziva TPawn.Create poziva se konstruktor TGame.Create.
Takodje se pre poziva TPawn.Create poziva konstruktor TBoard.Create.
TPawn.Create se poziva iz jedne od metoda TGame ovako
Code:
 
procedure TGame.Metoda;
begin
...
new(pawn);
pawn^:=TPawn.Create(@self, i);
...
end;

U cemu je greska?
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.verat.net.



+1 Profil

icon Re: Pokazivac na klasu!?!09.01.2005. u 18:50 - pre 234 meseci
EAccessViolation je greska koja se javlja kada neki pointer pokusa da pristupi delu memorije koji nije prethodno rezervisan za taj proces. Kao kad napravis dinamicku matricu od 100 clanova, pa probas da pristupis 101.-om, mada to zna ponekad i da prodje...

Ne znam da li znas ali moje je da kazem:
Pri radu sa klasama u Delphi-u, ti ne radis zapravo sa instancama klasi nego sa pokazivacima na njih. Delphi to organizuje nevidljivo za tebe, sto znaci...
Code:

var
  APawn: TPawn;

Ovde je APawn pokazivac na instancu TPawn-a (koji se zove APawn)!

Prema tome, nemas potrebu za PT*** varijablama.

Posto ti je myGame tipa PTGame ne mozes koristiti mygame.***, probaj sa mygame^.****, mada nisam nikad ovo radio i ne znam da li postoji.

E sad, U OBICNOM PASCALU mora da se radi onako kako si ti to organizovao jer kod njega su instance zapravo instance a ne pokazivaci, ali zato paskal moze funkcijama da prosledjuje samo standardne tipove podataka + pokazivace, a Delphi moze da prosledjuje sve zato sto prosledjuje pokazivace (po referenci) a ne cele klase (po instanci)...
Mozda si prethodno koristio obican Pascal ili C pa si navikao tako, jer to je karakteristicna Pascal struktura (to sa T**** i P****)...

To bi bilo to ako sam dobro svtio tvoj problem

I za svaki slucaj da znas da svaka klasa ima ugradjeni pointer Self koji oznacava trenutnu instancu te klase, mozda ti zatreba da ne bi vracao klasi pokazivac na nju posle konstrukcije...
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.212.EUnet.yu.



Profil

icon Re: Pokazivac na klasu!?!09.01.2005. u 20:40 - pre 234 meseci
Nazalost ovo mi nije pomoglo, ali u svakom slucaju hvala. Ovo poslednje sa self
Citat:
mozda ti zatreba da ne bi vracao klasi pokazivac na nju posle konstrukcije...
nisam razumeo.
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Pokazivac na klasu!?!09.01.2005. u 23:46 - pre 234 meseci
Cim kazes da koristis klase znaci da radis u Delphi-u (u Pascal-u postoje samo objekti koliko znam) i mogao bi ovako da deklarises klase
Code:
TBoard = class
  .
  .
  .
end;

TGame = class;

TPawn = class
  .
  MyGame: TGame;
  .
  constructor Create(aGame: TGame);
  .
  .
  .
end;

TGame = class
  .
  Pawn: TPawn;
  Board: TBoard;
  .
  procedure Metoda;
  .
  .
end;

constructor TPawn.Create;
begin
  MyGame := aGame;
  .
  .
  .
end;

procedure TGame.Metoda;
begin
  .
  Pawn := TPawn.Create(Self);
  .
  .
end;




 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
217.26.66.*



+1 Profil

icon Re: Pokazivac na klasu!?!10.01.2005. u 02:28 - pre 234 meseci
Citat:

Nazalost ovo mi nije pomoglo, ali u svakom slucaju hvala. Ovo poslednje sa self

Citat:

mozda ti zatreba da ne bi vracao klasi pokazivac na nju posle konstrukcije...


nisam razumeo.


Video sam gore u tvom kodu da si koristio @self...
@ je operator AddressOf, a posto je Self sam po sebi vec pointer na instancu klase, time si zapravo napisao AddressOf(AddressOf(Self^)) , tj. Pokazivac na pokazivac na klasu, samo sam hteo da ti kazem sta je Self.

Da li je problem i sa mygame.*** ili SAMO sa mygame.board.****?

@Srki: Pascal RADI sa klasama, samo nema rezervisanu rec [bold]class[/bold], nego programer treba da napravi pokazivac na objekat da bi mogao da ga prosledjuje funkcijama. Jedino sto je Delphi uveo je rezervisana rec class koja oznacava pokazivac na tip object i ima dodatne optimizacije za taj tip podatka. Objekti se koriste u pascalu jos od verzije 6, mislim (u 7 ih ima sigurno). Uostalom klasa po OOP definiciji i jeste naziv za neistancirani objekat, odnosno pokazivac na objekat (objekat = instanca klase). Secam se kad sam radio u pascalu da sam za svaki objekat morao da pravim
TSomething = object
PSomething = ^TSomething
Zato mi je njegov kod izgledao kao tipicna Pascal struktura.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: Pokazivac na klasu!?!10.01.2005. u 13:18 - pre 234 meseci
U principu, sve sto su ti kolege napisale gore stoji, sto ce reci da je pozeljno da koristis reference; ali moze da se radi i onako kako si ti napisao u prvom postu...
Code:

myGame:=game;


Nesto nisam video ovde new(myGame)...? Osecam da sam te sad zbunio, hehe. Gornja linija je KOPIRANJE sadrzaja jednog pointera u sadrzaj drugog pointera. A drugi pointer, nisi mu dodelio memoriju i sta sad? Ako si mislio da ovde radi dodeljivanje REFERENCI, varas se; to u Delphi-ju moze, ali samo sa INSTANCAMA objekata, ne i sa pointerima na instance.

Rajko
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.verat.net.



+1 Profil

icon Re: Pokazivac na klasu!?!10.01.2005. u 14:29 - pre 234 meseci
U pravu je Rajko, nije mi ni meni palo na pamet da treba rezervisati memoriju i za sam pointer, posto je u pitanju pokazivac na pokazivac na...Oh, well...(*zvuk pucnja iz pistolja*:-)
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Pokazivac na klasu!?!10.01.2005. u 14:45 - pre 234 meseci
Srki, preklinjem te, izbaci tu sliku.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pokazivac na klasu!?!

[ Pregleda: 3925 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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