Listen mit "List-Wrappern"
Übersicht BlitzBasic Codearchiv
BambooBetreff: Listen mit "List-Wrappern" |
Fr, Aug 29, 2014 11:01 Antworten mit Zitat |
|
---|---|---|
Da ich in BlitzBasic bisher keine Möglichkeit gefunden habe, dynamische Listen mit Type-Elementen zu erzeugen, habe ich mal versucht, diese zu simulieren. Ich weiß nicht, ob es bessere Wege gibt, aber im Forum habe ich keine gesehen. Das ganze ist nicht direkt eine Bibliothek mit verschiedenen Funktionen, sondern eher eine Konzeptdarstellung. Bei meinem derzeitigen Projekt hat mir diese Lösung sehr geholfen; ich wollte für verschiedene Layer einer Grafik eine Liste mit Farben erzeugen, und diese separat voneinander anlegen.
Grundsätzlich werden Types ja bereits in Listen gespeichert. Das Problem ist, dass man für zwei verschiedene Listen auch zwei verschiedene Types deklarieren müsste. Das ist aber nicht immer gewollt, insbesondere, wenn Types andere Types als Liste enthalten sollen. Ich habe versucht, das Ganze mit Types zu lösen, die als "List-Wrapper" fungieren, also andere Type-Elemente "verpacken" und so separate, dynamische Listen mögich machen. Also, beispielsweise möchte man mehrere Listen mit Personen machen. Eine Person wird dabei durch den Type T_Person repräsentiert: BlitzBasic: [AUSKLAPPEN] Type T_Person Man kann mit Hilfe von "List-Wrappern" zwei Listen anlegen, die Personen enthalten. Zuerst benötigt man dazu den Wrapper-Type von T_Person, der hier T_ListablePerson heißt. BlitzBasic: [AUSKLAPPEN] Type T_ListablePerson Der Wrapper-Type enthält lediglich zwei Felder: den Verweis auf den eigentlichen Type, und die Nummer der zugehörigen Liste. Natürlich kann man auch das Feld "list" einfach dem Type T_Person hinzufügen, aber ich wollte eine Möglichkeit schaffen, den eigentlichen Typ unberührt zu lassen. Möchte man jetzt verschiedene Listen anlegen, erstellt man für die Liste am besten einen eigenen Type: BlitzBasic: [AUSKLAPPEN] Type T_PersonList Dieser List-Type enthält einen Verweis auf die erste in der Liste gespeicherte Person, und eine Listennummer. Diese muss einzigartig sein; haben zwei Listen dieselbe Nummer, so können die Listen vermischt werden. Daher sollte die 0 als ID vermieden werden, da das list-Feld von T_Person immer mit 0 initalisiert wird. Mittels einer Funktion, die hier addPersonToList heißt, kann man eine Person zu einer solchen Liste hinzufügen. BlitzBasic: [AUSKLAPPEN] Function addPersonToList(parList.T_PersonList, parPerson.T_ListablePerson) Eine weitere Funktion namens printPersonsInList durchläuft alle Elemente der übergebenen Liste und gibt den Inhalt per Print aus: BlitzBasic: [AUSKLAPPEN] Function printPersonsInList(parList.T_PersonList) Nun folgt noch zwei weitere Funktionen, um das Erstellen von Personen und Personenlisten zu vereinfachen: BlitzBasic: [AUSKLAPPEN] Function newListablePerson.T_ListablePerson(parName$, parAge%) Eine weitere Funktion löscht eine Liste mitsamt ihrer eingetragenen Personen: BlitzBasic: [AUSKLAPPEN] Function deletePersonList(parList.T_PersonList) Hat man diese Types und Funktionen definiert, sollte folgende Handhabung möglich sein: BlitzBasic: [AUSKLAPPEN] Type T_Person |
||
Eingeproggt |
Fr, Aug 29, 2014 22:14 Antworten mit Zitat |
|
---|---|---|
Ich habe das von dir in der Einleitung erläuterte Problem immer so ungefähr gelöst:
Code: [AUSKLAPPEN] Type T_Person
Field name$ ;Name der Person Field age% ;Alter der Person Field nextPerson.T_Person End Type Damit muss man sich zwar ähnlich wie du das getan hast, um das Durch-Iterieren selber kümmern. Und diesen Schritt zu abstrahieren is bestimmt nicht blöd - aber dennoch ist es irgendwie einfacher find ich. Im Grunde ist es eh dasselbe was du getan hast, nur dass ich ohne 2 weiteren Types auskomme und mich um die Verwaltung selber kümmern muss. mfG, Christoph |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
DAK |
Sa, Aug 30, 2014 5:28 Antworten mit Zitat |
|
---|---|---|
Falls Interesse besteht kann ich eine DLL machen, die Listen und Maps in C++ nach Blitz durchschleift.
Die Listen gehen da ganz simpel. Bei den Maps würde ich String, Float, Int und Pointer auf ein Blitz-Objekt als Keys zulassen können. Dann braucht man sich die ganze Arbeit nicht antun, und man kann Listen und Maps ganz simpel verwenden. Braucht das wer? |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
BladeRunnerModerator |
Sa, Aug 30, 2014 11:47 Antworten mit Zitat |
|
---|---|---|
Wäre cool, DAK.
Auch wenn es wenige User sind, aber einige freuen sich sicher drüber. |
||
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 |
Übersicht BlitzBasic Codearchiv
Powered by phpBB © 2001 - 2006, phpBB Group