Pointer auf eine Typereferenz [GELÖST]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

bruZard

Betreff: Pointer auf eine Typereferenz [GELÖST]

BeitragDi, Okt 04, 2005 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Okt 04, 2005 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 05, 2005 9:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Jolinah

BeitragMi, Okt 05, 2005 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

bruZard

BeitragMi, Okt 05, 2005 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube ich hab's Very Happy Very Happy

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

BeitragMi, Okt 05, 2005 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah Smile

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

BeitragMi, Okt 05, 2005 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, mein Problem ist zumindest gelöst Smile Ich muss nicht mehr in einer Schleife alle Elemente der TList abgrasen um mein Objekt zu finden, sondern kann mit drei Casts direkt drauf zugreifen.

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

BeitragFr, Jun 02, 2006 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group