Pointer in Array speichern?
Übersicht

![]() |
Rick_72Betreff: Pointer in Array speichern? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] [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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst ja auch nicht einen völlig fremden Type als TLink casten. | ||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eigentlich hat Dreamora Recht. Das ist die simpelste Methode. | ||
![]() |
Rick_72 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
BladeRunner hat Folgendes geschrieben: myarray:object[]
Wie was wo? Das ist alles? Geil. Das war's! Vielen Dank!! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group