Problem mit Pointer auf Type!!

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Rone

Betreff: Problem mit Pointer auf Type!!

BeitragSo, Jul 23, 2006 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich muss einen Pointer auf einen Type zeigen lassen, also folgendermaßen:
Code: [AUSKLAPPEN]
Type TTest
...
End Type

Local objekt:TTest = New TTest
Local pointer:TTest Ptr = Varptr TTset


Da meckert allerdings direct der Compiler: "Illegal pointer Type".

Aber "pointer" soll auf "objekt" zeigen. Wenn ich "objekt" dann NULL setzte soll "pointer" auch auf NULL zeigen! (...hoffe ich hab mich einigermaßen verständlich ausgedrückt).
So dass ich über "pointer" prüfen kann ob "objekt"= Null ist:
Code: [AUSKLAPPEN]
objekt = Null
If pointer[0] = Null Then
   Print "Obejekt wurde gelöscht"
Else
   Print "Obejekt wurde NICHT gelöscht"
EndIf

Bei den Pointer Sachen hatte sich ja mal was geändert, muss man das jetzt anders machen wenn man einen Pointer auf einen Type zeihen lassen will??

Hoffe es kann mir jemand helfen....

mfg
Rone
 

Dreamora

BeitragSo, Jul 23, 2006 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Willste die offizielle oder die inoffizielle Antwort (die sich jederzeit wieder ändern kann?)


Offiziell: BM hat keine Pointer für den internen Gebrauch, weil sie den GC umgehen. Sprich wenn ein Objekt keine Referenzen mehr hat, wird es gelöscht, auch wenn es 10000 Pointer hat die darauf zeigen! Deswegen ist davon SEHR abzuraten.


Inoffiziell: Dein Ansatz ist schon mal garnet schlecht gewesen.
Allerdings gibts in BM keine Pointer Typen mehr womit dein Ansatz mit dem Type Ptr logischerweise in den Abfall geht. (es existiert nur noch Byte Ptr und der Existiert primär für den Externen gebrauch!)


Aber folgendes müsste eigentlich funktionieren (nicht getestet):

Code: [AUSKLAPPEN]

Type TTest
...
End Type

Local objekt:TTest = New TTest
Local pointer:TTest
(varptr pointer)[0] = varptr objekt
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rone

BeitragSo, Jul 23, 2006 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal danke für deine Antwort...

Zitat:
Sprich wenn ein Objekt keine Referenzen mehr hat, wird es gelöscht, auch wenn es 10000 Pointer hat die darauf zeigen! Deswegen ist davon SEHR abzuraten.

Genau das will ich ja! Allerdings will ich über die Pointer feststellen, dass das Objekt keine Referenz mehr hat

Zitat:
Aber folgendes müsste eigentlich funktionieren (nicht getestet):

Code: [AUSKLAPPEN]
Type TTest
...
End Type

Local objekt:TTest = New TTest
Local pointer:TTest
(varptr pointer)[0] = varptr objekt


Leider meckert der Compiler da:"Unable to convert from 'TTest Ptr' to 'TTest'.

Naja, werd erstmal noch ein bisschen rumprobieren...

Wenn jemand noch einen Tipp hat wäre ich dankbar..

mfg
Rone
 

Dreamora

BeitragSo, Jul 23, 2006 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn das so net geht, wirds wohl nicht zu machen sein.

BM gehört zu den modernen Programmiersprachen, sprich die die managed und typesafe sind und darum keine Pointer mehr unterstützen, sondern nur referenzen ...

Was willst du denn genau erreichen mit dem Pointer? Vielleicht gibts nämlich auch ne andere, viel einfachere Lösung ... (referenzen sind ja eigentlich auch Pointer, einfach type sichere pointer)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rone

BeitragSo, Jul 23, 2006 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte die "Verfolgungs-Raketen" Routine in meinem 2d shooter optimieren.
Vereinfacht sieht das so aus:

Code: [AUSKLAPPEN]
Type TGegner Extends TEntity
   
   Function Find:TGegner(x:Int , y:Int)
      Local g:TGegner
         'nächsten gegner finden..
      Return g
   End Function
                ...

End Type

Type rocket extends TGeschoss
   
   Field ziel:TGegner
      
   Method berechne()
      If ziel = Null Then
         ziel = gegner.Find(x , y)
      Endif
      'auf ziel rotieren + bewegen     
   End Method

End Type


Momentan habe ich es so gelöst, dass immer wenn ein Gegner zerstört wird, eine Liste mit allen Geschossen durchgelaufen wird, um zu checken ob eine der Geschosse eine Verforlgungsrakete ist UND ob sie als Ziel diesen Gegner hat, um Ziel auf NULL zu setzen, damit sich die Rakete ein neues Ziel sucht.

ich dachte durch Pointer kann ich das optimieren, indem ich Ziel einfach als Pointer auf die Referenz von einen Gegner mache und sich ziel dann automatisch auf NULL setzt wenn der Gegner gelöscht wird.

Halt einfach so:
Code: [AUSKLAPPEN]
Type rocket Extend TGeschoss

   Field ziel:TGegner Ptr
   
   Method berechne()
      
      If ziel[0] = Null Then
         ziel = Varptr ( gegner.Find(x , y) )
      Else
         'auf ziel bewegen
      EndIf
      
   End Method
   
End Type


Naja, wenns nicht geht... viel hätte sich eh nicht getan, hätte ich nur schöner gefunden.

mfg
 

Dreamora

BeitragSo, Jul 23, 2006 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wär mir nichtmal sicher ob das überhaupt so funktionieren würde ... Denn der GC arbeitet nicht "instantan", das heisst: nur weil das objekt jetzt nicht mehr referenziert ist, heisst das noch lange nicht, dass es jetzt auch weg ist ... der Pointer wäre also sehr unberechenbar.

Ich würde in diesem Falle eigentlich prinzipiell zu einem anderen Weg als einem Pointer raten, da dieser selbst in C++ sehr schludriges programmieren wäre (Pointer zu nutzem um den "Am leben sein Status" zu prüfen ist sehr gefährlich):

Dein Zielobjekt hat ja sicher etwas wie einen "Health" Wert, oder?
Falls nicht, so füge ihm einfach ein Feld "alive" hinzu, das true ist falls das objekt am leben ist und sonst false.

Nun kannst du bei allen zielsuchenden Raketen schauen, ob ihr Ziel "alive" ist (heisst entweder das Field alive = true oder health > 0) und wenn nicht, sucht sie sich ein neues Ziel.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rone

BeitragSo, Jul 23, 2006 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy Vielen Dank
Tja, "manchmal sieht man den Wald vor lauter Bäumen nicht".

Ich hatte die Gegner sowieso schon "versteckt" indem ich das visible field auf 0 gesetzt hab....
Schaut jetzt so aus:
Code: [AUSKLAPPEN]
Method Berechne(time:Int)   
      If Not ziel.IsVisible() Then
         ziel = TGegner.Find(Sprite)
      Else
         Local wink:Float  = (ATan2(ziel.Entityy()-Sprite.EntityY(),ziel.EntityX()-sprite.EntityX()) +450.0)Mod 360.0
         Local puf:Float   = sprite.EntityRotation() - wink
         If (puf < 0 And puf >= -180) Or (puf > 180 And puf<=360) Then
            sprite.TurnEntity(+5)
         ElseIf (puf >= 0 And puf =< 180) Or (puf < -180 And puf>= -360) Then
            sprite.TurnEntity(-5)
         EndIf
      EndIf
      sprite.MoveEntity(0,0,Self.Waffe.Speed)
End Method


mfg
 

Dreamora

BeitragMo, Jul 24, 2006 8:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Freut mich, das ich behilflich sein konnte.
Und das mit dem Wald kenn ich, wir sind alle nur Menschen Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group