Problem mit Pointer auf Type!!
Übersicht

![]() |
RoneBetreff: Problem mit Pointer auf Type!! |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Freut mich, das ich behilflich sein konnte.
Und das mit dem Wald kenn ich, wir sind alle nur Menschen ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group