Pointer auf eine Typereferenz [GELÖST]
Übersicht

![]() |
bruZardBetreff: Pointer auf eine Typereferenz [GELÖST] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht habe ich ja schon wieder ein Brett vor dem Kopf und in der Suche bin ich auch nicht fündig geworden.
Folgendes Problem: Um in meinem Editor eine unbegrenzte Anzahl an Layer realisieren zu können habe ich folgendes gemacht: Code: [AUSKLAPPEN] Type TLayer Global _list:TList Global count:Short Field id:Short Field layer:TBank Method New() count:+1 If _list:TList = Null Then _list:TList = New TList _list.AddLast(Self) id = count End Method End Type Das ist jetzt nur ein Schnipsel um zu erläutern worum es geht. In der Bank "layer" sichere ich nun "Zelleninformationen" für die Map ... Code: [AUSKLAPPEN] Rem Daten pro Tile -------------- tileset_id + 2 Byte tile_id + 4 Byte . . . usw. usf. EndRem Das funktioniert auch prächtig. Aber ich will den Kram nun optimieren. Bisher sichere ich eine ID des Tilesets welche ich über die Referenz bekomme (siehe Layer Type). Nun muss ich aber, wenn ich wissen will welche Daten zu diesem Tileset gesichert worden sind, per EachIn alle Listeneinträge absuchen, was irgendwann sicher lahm wird. Nun kam mir die Idee mir einen Pointer auf die Referenz geben zu lassen und diesen zu verwenden um direkt auf die Referenz zugreifen zu können. Allerdings hört es da bei mir völlig auf. Weder weiß ich wie ich einen Pointer auf eine Referenz bekomme, noch wie ich dann mit diesem Pointer weiterarbeiten kann. Ich wäre ausgesprochen dankbar wenn da jemand einen Rat für mich hätte. |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
- Zuletzt bearbeitet von bruZard am Mi, Okt 05, 2005 11:32, insgesamt einmal bearbeitet
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weiss nicht ob ich dich richtig verstanden habe, willst du den Pointer in der Bank speichern?
Wenn ja, so kannst du die Adresse des Objekts bekommen: Code: [AUSKLAPPEN] Local ref:TLayer = new TLayer
Local address:Int = Int(Byte Ptr(ref)) Allerdings hab ich noch nicht rausbekommen wie man in BMax nen Byte Ptr wieder in ne Type Referenz casten kann.. da kommt immer "Can't convert from 'Byte Ptr' to <unknown>". Hab schon versucht mittels MemCopy und einem Zeiger auf die Referenz die Adresse des Types da rein zu kopieren. Das hat aber irgendwie nicht funktioniert, da war dann ne andere Adresse drin, 8 Bytes daneben.. Wenn du es aber nicht in der Bank speichern willst brauchst du das nicht und kannst es mit den Referenzen selber machen oder mit Pointer auf die Referenz: Code: [AUSKLAPPEN] Local ref:TLayer = new TLayer Local refpt:TLayer Ptr = Varptr(ref) 'Zeiger auf die Referenz Print refpt[0].id 'dereferenzieren |
||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm, schonmal danke für den Tipp... aber es geht mir ja primär darum die Adresse der Referenz in die Bank zu bekommen.
Naja, zumindest hast Du mir jetzt erklärt wie ich eine Adresse wieder dereferenzieren kann, damit kann ich auch schon was anfangen ![]() |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also die Adresse der Referenz ist:
Code: [AUSKLAPPEN] Int(Varptr(ref))
Int(Byte Ptr(ref)) ist jedoch die Adresse des Objekts. Byte Ptr() konvertiert die Referenz in einen Byte Ptr, Varptr() gibt einen Zeiger auf das übergebene Objekt (die Referenz) zurück. Nur weiss ich wie gesagt noch nicht wie man von einem Int wieder zurück auf ein Objekt kommt. Ein Byte Ptr der wieder auf diese Adresse zeigt kann man erstellen mit: Code: [AUSKLAPPEN] Local pt:Byte Ptr = Byte Ptr(Int_Adresse)
Aber sowas funktioniert dann leider nicht: Code: [AUSKLAPPEN] Local var:TLayer = TLayer(byte_ptr)
Also hab ich versucht ein wenig rumzutricksen und die Adresse manuell reinzukopieren: Code: [AUSKLAPPEN] Local varpt:TLayer Ptr = Varptr(var) 'Zeiger auf die Type-Referenz Local adrpt:Byte Ptr = Varptr(Adresse) 'Zeiger auf den Int wo die Adresse drin steht MemCopy(varpt, adrpt, 4) 'Den Int-Wert der Adresse in die Referenz schreiben. Aber das hat leider auch nicht funktioniert ![]() |
||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube ich hab's ![]() ![]() Code: [AUSKLAPPEN] Strict Type TTest Global _list:TList Field schnicks:String Method New() If _list:TList = Null Then _list:TList = New TList _list.AddLast(Self) End Method Method SetSchnicks(schnicks:String) self.schnicks = schnicks End Method End Type Local test:TTest = New TTest test.SetSchnicks("Hallo Welt") Local pointer:TTest Ptr = Varptr test ' Zeiger auf die Referenz Local toBank:Int = Int(pointer) ' auf Integer casten ' -> Int in die Bank schreiben ' ... ' <- Int aus der Bank lesen Local fromBank:TTest Ptr = TTest Ptr(toBank) DebugLog fromBank[0].schnicks |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah ![]() Ist ja ganz simpel.. und eigentlich auch logisch. Aber direkt auf ne Objekt-Referenz casten geht nach wie vor nicht.. wahrscheinlich weil es Type-Safe ist. Dann frag ich mich aber wozu man überhaupt eine Objekt-Referenz in nen Pointer casten kann. |
||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, mein Problem ist zumindest gelöst ![]() Danke für Deinen Denkanstoß, ohne den hätte ich es wohl nicht lösen können. |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur zur Info:
Seit irgendeinem BMax Update funktioniert obige Lösung nicht mehr. Eine Objekt-Referenz muss man nun folgendermaßen casten: Code: [AUSKLAPPEN] Local obj:TObject = New TObject Local obj_pointer:Int Ptr = Int Ptr(Varptr obj) ... |
||
Farbfinsternis.tv |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group