Fragen zu Handle und Object
Übersicht

![]() |
FireballFlameBetreff: Fragen zu Handle und Object |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde oben nicht True sondern Not Null schreiben. Dann kannst du dir das <> Null sparen. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, das ist doch schonmal was ![]() @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() weis jemand dafür einen trick? |
||
|moonForge|
Ich bin Pokémon Meisterin seit 1998! |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mh, wieso läuft's bei dir wieder nicht? ![]() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group