Pointer in Array speichern?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Rick_72

Betreff: Pointer in Array speichern?

BeitragSa, Feb 13, 2010 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,
ich ralls grad gar nicht mehr. Ich habe ein Objekt und möchte dessen Referenz (also den Pointer aufs Objekt) in einem Array:Tlink speichern. Ungefähr so:

Code: [AUSKLAPPEN]
Global myArray:TLink[10]

Type myType
   Field x:Int
End Type

my:myType = New myType

myArray[0] = ??? my ???


Wie kann ich den Pointer auf my im Array ablegen? Sowas wie die ungedrehte Value-Methode halt..

Kann mir jemand helfen?

Danke!

mpmxyz

BeitragSa, Feb 13, 2010 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
TLink-Objekte gehören zu den TLists.
Die Variable "my" ist schon eine Referenz.
Ein Array mit Referenzen erstellst du wie eine Variable:
BlitzBasic: [AUSKLAPPEN]
Global myArray:myType[10]

Type myType
Field x:Int
End Type

my:myType = New myType

myArray[0] = my


[Edit]Ich glaube, dass ich dich falsch verstanden hatte. Die TLink-Objekte sind aber nicht dazu gedacht, dass man ihren Inhalt ändert. Du kannst höchstens auf das Field "_value" zugreifen.
Wozu möchtest du denn das machen?[/Edit]

mfG
mpmxyz

Rick_72

BeitragSa, Feb 13, 2010 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist etwas schwierig zu erklären. Im wesentlichen nutze ich das Array, um an Objekte zu kommen, die auf einer Spielfläche graphisch repräsentiert werden. Diese Objekte sind aber in einer Liste gespeichert (das geht nicht anders), deren Ordnung eine ganz andere als die des Spielfeldes ist.

Somit stellt die Position im Array den Zusammenhang zwischen Liste und Spielfeld her: im Array steckt ein Pointer, und der zeigt direkt auf das passende Listenelement.

Ich prüfe also den Mauszeiger (wo steckt er auf der Fläche?), und hole mir aus dem Array an der entsprechenden Position den Zeiger auf das Listenelement.

Man kann ja den Pointer auslesen (ptr - BlitzMax), aber ich bekomme ihn nicht als TLink gecastet, kann ihn also nicht im Array speichern. Aber irgendwie muss das doch gehen, oder? <- klar geht das, aber die Lösung versteckt sich vor mir.. wahrscheinlich irgendwo in dem völlig miesen "Manual".

Artemis

BeitragSa, Feb 13, 2010 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ja auch nicht einen völlig fremden Type als TLink casten.

mpmxyz

BeitragSa, Feb 13, 2010 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum speicherst du nicht gleich die richtigen Objektreferenzen im Array?
Dein System macht nämlich so keinen großen Sinn.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Rick_72

BeitragSa, Feb 13, 2010 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
mpmxyz hat Folgendes geschrieben:
Warum speicherst du nicht gleich die richtigen Objektreferenzen im Array?
Dein System macht nämlich so keinen großen Sinn.
mfG
mpmxyz


Dochdoch, macht schon Sinn. Ist ja hier etwas aus dem Zusammenhang gerissen. Wie speicher ich denn die Referenz im Array? Das ist doch meine Frage gewesen?
 

Dreamora

BeitragSa, Feb 13, 2010 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
einfach den array entsprechend deklarieren (entweder als array der diesen type enthält oder eine base klasse)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rick_72

BeitragSa, Feb 13, 2010 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
einfach den array entsprechend deklarieren (entweder als array der diesen type enthält oder eine base klasse)


Naja gut, das ist kein Problem, das Array als myType zu definieren. Aber wenn ich die Link-Klasse nutzen will? Wie erhalte ich denn die Referenz auf das aktuelle Objekt "my" und stopfe diese als Link in das Array? Das muss doch irgendwie gehen?!
 

Dreamora

BeitragSa, Feb 13, 2010 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
dann musst du den array als type object deklarieren und alles blödsinnig rumcasten.

Aber irgendwie scheint mir das du obige hinweise effektiv einfach ignorierst: es gibt weder intelligente noch sinnvolle gründe etwas in eine liste zu stopfen um dann die links in einen array zu stopfen, da das resizing des arrays jeglichen vorteil den du eventuell mal von der list hattest schrotten wird.

Da kannst du:

a) direkt von anfang an den array nehmen
b) beides kicken und stattdessen TMap nehmen (Dictionary)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rick_72

BeitragSa, Feb 13, 2010 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich hat Dreamora Recht. Das ist die simpelste Methode.

Rick_72

BeitragSo, Feb 14, 2010 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
dann musst du den array als type object deklarieren und alles blödsinnig rumcasten.

Aber irgendwie scheint mir das du obige hinweise effektiv einfach ignorierst: es gibt weder intelligente noch sinnvolle gründe etwas in eine liste zu stopfen um dann die links in einen array zu stopfen, da das resizing des arrays jeglichen vorteil den du eventuell mal von der list hattest schrotten wird.

Da kannst du:

a) direkt von anfang an den array nehmen
b) beides kicken und stattdessen TMap nehmen (Dictionary)


Du hast ja im Prinzip Recht. Aber ich will's verstehen, anwenden, können. Very Happy

OK, zur Vollständigkeit: es geht um einen Editor. Das Spiel ist Tile-based, hat also eine endlich Anzahl von Elementen pro Bildschirm (in dem Fall: Raum -> Mann rennt durch Raum Wink ). Im Editor kann man einem Raum beliebig viele Elemente (bis der Laden voll ist) hinzufügen.

Die Elemente werden in einer Liste gespeichert (und zwar in der Reihenfolge, in der sie hinzugefügt wurden; es gibt viele verschiedene Elemente; manche haben spezielle Eigenschaften wie Größe etc.). Die Räume selber bilden eine Liste, deren Nodes eben diese Listen mit den Elementen enthalten.

Das Array ist so gross wie die TileMap (also zB 40x25).

Daraus folgt aber: wenn ein Element der Länge 3 an (1,1) gespeichert ist, muss (soll) das Array von [1,1] bis zB [1,4] die Referenz auf dieses *eine* Objekt enthalten. Wenn ich dann später prüfe, auf welcher Tile der Mauszeiger ist, kann ich aus dem Array heraus direkt das richtige Objekt referenzieren (was dann irgendeine dämliche Graphik unterm Cursor ist).

Klar ist: alles geht einfacher.

Aber ich will den Driss ja auch lernen, und deswegen versuche gerne mal was total Bizarres, habe es danach aber - hoffentlich - begriffen. Insofern bitte ich um Nachsicht.
 

Dreamora

BeitragSo, Feb 14, 2010 0:33
Antworten mit Zitat
Benutzer-Profile anzeigen
naja wenn du objekte die in keinster form verwandt sind speichern willst in der selben referenz bleibt nur die Klasse Object übrig und dann casten


Die meisten andereren leute würden dein problem vermutlich dadurch lösen das sie einen array haben für die tilemap und der array selbst in jedem element eine liste enthält die auf die verschiedenen objekte an der position verweist, sinnvollerweise entsprechend ihrer "höhe" /zeichenfolge (alternativ zur liste wäre hier auch ein heap / priority list zu empfehlen, da sie das sortieren automatisch erledigt in O(log(n)) statt den O(n) die du bei insertion sort auf liste einkassieren wirst)

Was das wichtigste für deine ID Datenbank sein wird, ist das handling des Arrays, bzw wie und wann vergrössern:

Wann: Wenn du das erste objekt reinschreiben willst das von der grösse her nimmer reinpasst
Wie: Grösser / Kleiner machen immer mit dem Faktor 2! Wenns vorher 8 elemente waren, vergrösser ihn auf 16 elemente etc. Dadurch werden die "vergrösserungskosten pro element" wieder erträglich klein. wenn du ihn nach jedem element vergrösserst, wird die performance darunter leiden da die speicher kopien nicht umsonst sind
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rick_72

BeitragSo, Feb 14, 2010 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Array ist von konstanter Größe. Mein wesentliches Problem ist ja tatsächlich, dass im Array verschiedene Objekte referenziert werden sollen, sonst würde array:myType ja wunderbar funktionieren:

Code: [AUSKLAPPEN]
Global myArray:TLink[10]

Type myType1
   Field x:Int
End Type

Type myType2
   Field x:Int
End Type


my1:myType1 = New myType1
my2:myType2 = New myType2

myArray[1] = ??? reference To my1 ???
myArray[2] = ??? reference To my2 ???


Ich muss also den Pointer extrahieren und dann hinterher rumcasten, was nicht schlimm wäre. Aber schlag mal was vor, wie ich den Pointer von "my1" strippe und dann in myArray[1] speicher. Ich komm einfach auf grünen Zweig. Man kann ja über ptr die reale Adresse ermitteln, aber die nützt mir nix. Ich kann sie nicht in TLink casten. Hast Du da eine Idee?

BladeRunner

Moderator

BeitragSo, Feb 14, 2010 0:52
Antworten mit Zitat
Benutzer-Profile anzeigen
myarray:object[]
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

Rick_72

BeitragSo, Feb 14, 2010 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
myarray:object[]


Wie was wo? Das ist alles? Geil.

Das war's! Vielen Dank!!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group