Überprüfen ob Objekt nicht gleiches Objekt ist.

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Überprüfen ob Objekt nicht gleiches Objekt ist.

BeitragDi, März 23, 2010 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich hab mal wieder ne kleine Frage zu BMax.
Undzwar: Ich will ne Funktion schreiben, die beim erstellen einer neuen Klasseninstanz die Koordinaten überprüft und mit allen anderen Instanzen der Klasse vergleicht und die neue INstanz gegebenenfalls versetzt.
Jetzt darf ich aber diese neue Instanz nicht mit sich selbst vergleichen.
Nur weiß ich nicht, wie genau ich das schreibe.

Meine Methode sieht momentan so aus:

BlitzMax: [AUSKLAPPEN]
	Method SetAtPlace()
Local Tries:Int = 0
Local IsSet:Int = 0

While ((IsSet = 0) Or (Tries = 0))
IsSet = IsSet + 1
For Local Base:TBase = EachIn TBase.AllBases
If Base Not 'Hier ist die Abfrage wo ich nicht weiterkomme

Next
Wend
End Method


Vielleicht kann mir jemand helfen, Lg, M0rgenstern.

BladeRunner

Moderator

BeitragDi, März 23, 2010 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
'self' sollte dir da helfen:
if base <> self then ...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

M0rgenstern

BeitragDi, März 23, 2010 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja Okay. Das ist es.
Dankeschön

Ne andere Frage:
Ich möchte das neu erstellte Objekt direkt löschen, wenn es 5 mal am falschen Platz ist.
Aber ich kann den Destruktor nicht Aufrufen.
Werden mit Self.delete() noch mit Delete(Self) noch mit Delete() Self.

Hier ist die Methode:

BlitzMax: [AUSKLAPPEN]
 Method SetAtPlace()
Local Tries:Int = 0
Local IsSet:Int = 0
Local Stop:Int = 0

While Stop = 0
Tries:+1
For Local Base:TBase = EachIn TBase.AllBases
If Base <> Self Then
If Pythagoras(iX, iY, Base.iX, Base.iY) < 100 Then
iX = Rand(64, GraphicsWidth() - 64)
iY = Rand(64, GraphicsHeight() - 64)
EndIf
Else
IsSet = 1
EndIf
Next
If Tries >= 5 Then
Stop = 1
If (IsSet <> 1) Then Delete(Self)
EndIf
If IsSet = 1 Then Stop = 1
Wend
End Method


Oder muss ich aus der Methode ne Funktion machen und das Objekt dann ausserhalb löschen? Also, wenn die funktion nen bestimmten Wert ausgibt?

Lg, m0rgenstern

Xeres

Moderator

BeitragDi, März 23, 2010 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst in BM kein Objekt per Hand löschen. Es reicht, wenn du alle Verweise darauf löschst -> aus AllBases austragen und fertig, den Rest geschieht automatisch.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mpmxyz

BeitragDi, März 23, 2010 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Objekt wird automatisch gelöscht, sobald keine Referenz mehr darauf zeigt.
Wenn du es also löschen lassen möchtest, muss du es z.B. aus allen Listen entfernen.
Der Garbage Collector macht den Rest und ruft "Delete" auf.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragDi, März 23, 2010 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso. Das ist gut zu wissen.
Ich bin das objektorientierte programmieren mit pascal aus der schule gewohnt. Dort gibt es einen solchen Collector nicht. Deshalb rufe ich den Destruktor immer von Hand auf.
Aber rein aus Interesse: Wie rufe ich in Bmax den Destruktor auf?

Vielen Dank für eure Hilfe.
Lg, M0rgenstern.
 

n-Halbleiter

BeitragDi, März 23, 2010 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurz und knapp: Gar nicht. Mit ein wenig Umgewöhnung kommst du schon mit dem GC klar und ihr werdet beste Freunde. Wink

Du kannst allerdings in Types die Methode "Delete()" definieren, die dann vor dem Löschen aufgerufen wird.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

M0rgenstern

BeitragMi, März 24, 2010 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, das ist komisch.
Im OOP Tutorial stand, dass das eine eigene Methode von jedem Type ist, genau wie New().
Dann werd ich den halt von Hand schreiben und das löschen der INstanz aus der Liste in den Destruktor einfügen.

Vielen Dank euch allen.

Lg, M0rgenstern

d-bug

BeitragMi, März 24, 2010 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist sie ja auch, aber sie löscht eben nicht die Instanz des Objektes sondern dient dazu eventuelle Verlinkungen, die auf die Instanz zeigen und von der Instanz wegzeigen, zu löschen damit der GC die Instanz komplett löschen kann.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group