Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi pointer und proceduren (https://www.delphipraxis.net/6047-pointer-und-proceduren.html)

braingrenade 27. Jun 2003 14:02


pointer und proceduren
 
Moin Leute !

hab folgendes problem:

Delphi-Quellcode:

Type tding = class
    private
      x,y : integer;
    public
     procedure move(xpos,ypos);
end;


Type PTding = ^Tding;

var X : Tding;
var PX : PTding;


procedure tding.move(xpos,ypos);
begin
x := x + xpos; //hier kommt der Fehler
y := y + ypos;
end;

procedure ...
begin
PX := @Tding;
PX.move(2,2);
end;
So , beim asführen gibt er mir aber eine Acces violation.

Weiß jemand warum ?

sakura 27. Jun 2003 14:23

Du musst die Klasse erst einmal initialisieren. Aber wozu benötigst Du an der Stelle Pointer, das ist eher ungewöhnlich und, wie Du merkst, gefährlich.

...:cat:...

braingrenade 27. Jun 2003 14:55

Initialisert hab ichs, und leider brauch ich den pointer an dieser stelle
um praktischer an das objekt ranzukommen!

sakura 27. Jun 2003 14:58

Zitat:

Zitat von braingrenade
Initialisert hab ichs

Delphi-Quellcode:
var
  Ding: TDing;
// FALSCH!!!
PX := @Tding;
// BESSER
Ding := Tding.Create;
PX := @Ding;
Zitat:

Zitat von braingrenade
um praktischer an das objekt ranzukommen!

Erklär mal, warum eine normale Klassenvariable es nicht tut. Bedenke, es kommt die Zeit, da werden Pointer verboten sein ;-)

...:cat:...

Christian Seehase 27. Jun 2003 15:22

Moin braingrenade,

Zitat:

Zitat von braingrenade
leider brauch ich den pointer an dieser stelle
um praktischer an das objekt ranzukommen!

das eine Klassenvariable einen Pointer auf das Objekt enthält ist Dir aber schon klar?

Mir fällt da nur eine Notwendigkeit ein einen solchen Umweg zu gehen.
Der ist zum einen aber ein "schmutziger Trick" (;-)), zum anderen bei eigenen Objekten nicht notwendig.

braingrenade 27. Jun 2003 16:38

@sakura : das crewate hab ich an ner anderen stelle im code

@Christian : Wie geht der trick?

Christian Seehase 27. Jun 2003 17:12

Moin braingrenade,

wenn Du unter "schmutziger Trick" suchst, solltest Du es hier finden können. Wie gesagt, ist auch nicht schön, und diente nur als Beispiel dafür, dass eine ReadOnly Eigenschaft, zur Not auch verändert werden kann (produktiv würd' ich das allerdings nicht unbedingt riskieren)

braingrenade 27. Jun 2003 17:35

Moin !


Ich den trick gefunden , aber ich blick nicht ganz wie das in meinem fall anzuwenden ist ...

Christian Seehase 27. Jun 2003 17:40

Moin braingrenade,

das war nur ein Beispiel, wo man so einen "um die Ecke" Zugriff verwenden kann.
Ob das bei Deinem Problem weiterhilft kann ich allein deshalb nicht beurteilen, da mir absolut nicht klar ist, was Du überhaupt vorhast.

Dein Codebeispiel aus dem Eingangsposting macht für mich nämlich überhaupt keinen Sinn (oder vielleicht fehlt auch nur die Begründung)

braingrenade 27. Jun 2003 17:48

Aso !

dann post ich halt mal den ganzen code , aber das ist recht viel !

ICh will eine spriteengine programieren , das meiste hab ich schon ,
aber alle sprites die hinzugefügt werden werden unter einem großen array
gespeichert in dem keine ordnugn herrscht , deshlab will ich mit pointern auf die einzelnen sprites zugreifen können und über diese auch proceduren ausführen können.

braingrenade 29. Jun 2003 12:22

Weiß keiner wo der Fehler liegen könnte ?

Christian Seehase 29. Jun 2003 12:33

Moin Braingrenade,

ich wollte mir gerade mal Deinen Source herunterladen.
Könntest Du das bitte auch mal probieren?

Bei beiden Dateien bekomme ich nur ein 0 Byte grosses Zip.

braingrenade 29. Jun 2003 12:40

Liste der Anhänge anzeigen (Anzahl: 1)
hoppsa ... :oops:

Touchdown 29. Jun 2003 12:40

Die Fehlermeldung ist eindeutig.

Zu 100% fragst du eine Eigenschaft eines nil-Pointers ab.

Durch Debuggen sollte es kein Problem sein die Stelle zu finden

Christian Seehase 29. Jun 2003 12:53

Moin braingrenade,

auch nachdem ich mir Deine Sourcen angesehen habe, ist mir nicht klar, wozu Du einen Pointer auf die Pointer der Objekte brauchst.

Das was Du da mit PTSprite machst, kannst Du genausogut mit TSprite machen.

Eine Objektvariable enthält immer nur den Pointer auf das Objekt und Du benutzt den Pointer auf einen Pointer.

sakura 29. Jun 2003 12:53

Zitat:

Zitat von Touchdown
Zu 100% fragst du eine Eigenschaft eines nil-Pointers ab.

Wollen wir wetten? Eine Accessviolation kann auch bei einem Pointer auftreten, welcher auf ein nicht mehr vorhandenes Object zeigt, aber welcher auch nicht nil ist, diese kann auch auftreten, wenn ein Pointer falsch gecastet wird, also z.B. vom Typ A ist, aber auf Typ B gecastet wird...

...:cat:...

braingrenade 29. Jun 2003 13:13

hmmmm...

Also falschen Typecast schließe ich aus,
und die anderen sachen eigentlich auch , weil der Compiler bei einer Procedure völlig ohne Pointer anhält , ich glaube das problem liegt daran eine procedure von einem Pointer aus aufzurufen und variablen zu übergeben ,
ich denke das ich da irgendwas falsch gemacht habe...

Touchdown 29. Jun 2003 14:08

Ja stimmt, hab mich auch schon mit falschen Typecast's selbst in den Fuss geschossen :mrgreen:

Ohne den Code gesehen zu haben, tippe ich auf einen lokalen Pointer der nil ist, du aber einen globalen ansprechen willst.

oder

du willst eine Methode einer Klasse aufrufen, von dessen Klasse keine Instanz gebildet wurde.

Christian Seehase 29. Jun 2003 14:24

Moin braingrenade,

ich hab' diese Stelle in Verdacht:

Code:
function tspriteengine.Collision(sprite1,sprite2 : PTsprite): boolean;
var
   i, i2 : integer;
   spr1,spr2 : Tspriteset ;
begin
spr1 := sprite1.setsprpos;
spr2 := sprite2.setsprpos;
  for i := 0 to high(spr1) do
    begin
     if i > 0 then
        if (spr1[i-1].paar = false) and (spr1[i].paar = true) then
      for i2 := 0 to high(spr2) do [color=red]// In dieser Schleife werden spr1 mit Index von spr2 und spr2 mit Index auf spr1 angesprochen, kann schiefgehen, wenn die arrays nicht gleich gross sind.[/color]
         if (spr1[i-1].x < spr2[i].x) and (spr1[i2].x > spr2[i2].x) and           (spr1[i].y = spr2[i].y) then result := true
          else
           result:=false;
          end;
end;

braingrenade 29. Jun 2003 15:15

Ah ja, da is ein fehler , aber der ist leider nicht das problem,
denn der code hängt ja schon früher ,aber trotzdem danke !


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz