Fragen zu Handle und Object

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

FireballFlame

Betreff: Fragen zu Handle und Object

BeitragSo, Jan 18, 2009 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallihallo, ich arbeite in meinem Spiel mit ziemlich vielen Types. Dabei habe ich das Problem, dass verschiedene Types untereinander nicht kompatibel sind. Damit meine ich folgendes:
Wenn ich z.B. eine Variable deklariere (in der ich später ein Typeobjekt speichern will), muss ich dabei den Type mit angeben, d.h. die Variable ist auf Objekte eines bestimmten Types beschränkt.
Wenn ich also eine Funktion schreibe, die den Wert aus dem Field x eines Objektes zurückgeben soll, muss ich das Type des Objektes in der Funktionsdeklaration mit angeben.
Da ich aber mehrere Types mit einem Field x habe, möchte ich meiner Funktion ein beliebiges Objekt mitgeben können, und die Funktion soll dann selber herausfinden, zu welchem Type das Objekt gehört.

Dies scheint mit dem Befehl Handle möglich zu sein, denn der Funktion kann ich dann einfach einen Integerparameter übergeben. Aber leider benötigt die Umkehrfunktion Object trotzdem wieder eine Angabe des Types (und die Variable in der ich das Ergebnis speichere auch), was einen "schönen" Code ohne Fallunterscheidung unmöglich macht. Immerhin könnte ich, falls
1. die Werte, die der Handle-Befehl zurückgibt, im ganzen Programm eindeutig sind, also niemals zwei Type-Objekte das gleiche Handle bekommen können, auch wenn sie unterschiedlichen Types angehören und
2. ein Handle nicht "verfällt", also ein einmal ermitteltes Handle garantiert solange auf das richtige Objekt zeigt, bis ich dieses lösche,
die Fallunterscheidung relativ kurz halten.

Deshalb meine Frage: sind diese beiden fettgedruckten Annahmen richtig?
Wenn ja, dann müsste theoretisch folgender Code funktionieren:

Code: [AUSKLAPPEN]
; Funktion soll den Wert von Field x aus dem Objekt mit
; dem Handle objekthandle zurückgeben;
; das Type, dem objekthandle angehört, ist dabei nicht bekannt

Function get_x(objekthandle)
   Local gesuchtes_x
   
   Select True
      Case Int(Object.type1(objekthandle))>0
         Local temp1.type1=Object.type1(objekthandle)
         gesuchtes_x=temp1\x
      Case Int(Object.type2(objekthandle))>0
         Local temp2.type2=Object.type2(objekthandle)
         gesuchtes_x=temp2\x
      Case Int(Object.type3(objekthandle))>0
         Local temp3.type3=Object.type3(objekthandle)
         gesuchtes_x=temp3\x
      ; usw., für alle infragekommenden Types
         
      Default
         RuntimeError "Objekt existiert nicht"
   End Select
End Function
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Noobody

BeitragSo, Jan 18, 2009 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine beiden Annahmen sind richtig, und theoretisch müsste dein Code funktionieren (könnte höchstens sein, dass dein Select - Case Konstrukt Probleme macht, ich habe so eine Anwendung noch nie gesehen Razz ).
Ausserdem kannst du dir das Int() sparen - um zu schauen, ob ein Type existiert, gibt es das Schlüsselwort 'Null' - in deinem Fall also 'Case Object.Type1( TypeHandle ) <> Null'.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Nicdel

BeitragSo, Jan 18, 2009 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde oben nicht True sondern Not Null schreiben. Dann kannst du dir das <> Null sparen.

Xeres

Moderator

BeitragSo, Jan 18, 2009 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Select finde ich es hübscher - funktionieren tut es aber prinzipiell hervorragend. Gute Idee.
Code: [AUSKLAPPEN]
Type Ttest1
   Field x
End Type

Type Ttest2
   Field x
End Type

Local t1.Ttest1 = New Ttest1
t1\x = Rand(1,5)
Local t2.Ttest2 = New Ttest2
t2\x = Rand(6,9)

Print("Type1: "+ get_x(Handle(t1)))
Print("Type2: "+ get_x(Handle(t2)))

WaitKey()
End

Function get_x(objekthandle)
   If Object.Ttest1(objekthandle) <> Null Then
      Local temp1.Ttest1 = Object.Ttest1(objekthandle)
      Return temp1\x
   ElseIf Object.Ttest2(objekthandle) <> Null Then
      Local temp2.Ttest2 = Object.Ttest2(objekthandle)
      Return temp2\x
   Else
      RuntimeError "Objekt existiert nicht"
   End If
End Function
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)

Noobody

BeitragSo, Jan 18, 2009 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicdel hat Folgendes geschrieben:
Ich würde oben nicht True sondern Not Null schreiben. Dann kannst du dir das <> Null sparen.


Null ist ähnlich wie eine Typeinstanz, daher kann man auch kein logisches Not darauf anwenden ('Illegal Type Conversion').
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

FireballFlame

BeitragSo, Jan 18, 2009 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, das ist doch schonmal was Smile
@Noobody: Autsch, natürlich ... das "Null" war mir irgendwie entfallen ^^
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

AnniXa

BeitragMo, Apr 13, 2009 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
es trifft zwar nur teilweise das thema, aber ich dachte mir ich frag mal hier, ehe ich ein neus aufmache.

angenommen ich speichere ein Handle in einer variable, und möchte später auf das objekt wieder zugreifen,
es kann aber durchaus sein das dieses objekt dann nichtmehr existiert, gibt es eine möglichkeit dies zu prüfen?
nun hoffte ich auch hier mit
If Object.foo( bar% ) <> Null Then ...
das hinzubekommen, aber dies scheint nicht zu funktionieren Sad
weis jemand dafür einen trick?
|moonForge|
Ich bin Pokémon Meisterin seit 1998!

Xeres

Moderator

BeitragMo, Apr 13, 2009 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh, wieso läuft's bei dir wieder nicht? Wink
Code: [AUSKLAPPEN]
Type TTest
   Field Wert
End Type

Local t.TTest = New TTest
Local h = Handle(t)
Delete t

If Object.TTest(h) = Null Then Print("Objekt vom handle '"+h+"' wurde vernichtet!")
WaitKey()
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)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group