Type in Type liefert unerwartetes Ergebnis
Übersicht

![]() |
Rick_72Betreff: Type in Type liefert unerwartetes Ergebnis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Comm.,
ich habe ein Problem mit folgendem Code: Code: [AUSKLAPPEN] Graphics 800,600,32,2
Type down Field x Field y.upper End Type Type upper Field z End Type ;erstelle Liste mit zwei Elementen toll.down = New down toll\x = 1 toll.down = New down toll\x = 2 ;springe zum ersten Element down toll.down =First down ;und hänge dort Liste mit 5 weiteren Elementen upper an For i=10 To 15 toll\y =New upper toll\y\z =i Next ;springe zum ersten Element down toll.down =First down toll\y.Upper =First upper ;springe zum ersten Element upper in angehängter Liste While toll\y<>Null Print Str$(toll) toll\y = After toll\y Wend ;springe zum zweiten Element upper, an das keine Liste upper gehängt wurde! toll = After toll toll\y.Upper =First upper ;sollte eigentlich NULL sein? ;zweites Element down enthält aber auch 5 Elemente upper While toll\y<>Null Print Str$(toll) toll\y = After toll\y Wend WaitKey() Ich erstelle eine Liste mit zwei Elementen "down" und hänge dann an das erste Element der Liste 5 weitere Elemente "upper" an. An das zweite Element down wird nix gehängt (zumindest nicht bewusst). Wenn ich die Chose aber ausgebe, muss ich feststellen, dass sowohl am ersten als auch am zweiten Element "down" jeweils 5 Elemente "upper" hängen. Was habe ich hier nicht verstanden? Freue mich über Aufklärung, wie ich erreiche, dass meine Zusatzliste mit den 5 Elementen nur da auftaucht, wo ich sie gerne hätte. Danke und Grüße! |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
für jeden Type gibt es nur eine Liste. Das Field "Y" referenziert nur einen Eintrag vom "upper"-Type. Es erstellt keine neue Liste! Du müsstest es so angehen: BlitzBasic: [AUSKLAPPEN] Type down Wenn du jetzt eine der "Listen" durchgehen willst, dann musst du alle "upper"-Einträge durchgehen, bei dem "Parent" der Eintrag der durchsuchten "Liste" ist. Ich hoffe, dass es halbwegs verständlich war. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Rick_72 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du meinst also, ich soll die Liste nummerieren und dann anhand der NUmmerierung die passenden Einträge aussortieren. Das ginge natürlich, und wird wohl das Mittel der Wahl werden. Danke für den Vorschlag!
Aber gibt's denn keine Möglichkeit, eine Unterliste an jeweils nur ein Listenelement zu hängen? In C ging das.. ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du Listen selbst Verwalten möchtest, musst du mit BlitzMax arbeiten. In BB gibt es keine Möglichkeiten daran was zu drehen. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da gibt es leider keine leichte, in Blitzbasic vorhandene Möglichkeit.
Man kann mit Banks, welche eigentlich nur Speicherbereiche sind, echte Listen in Listen erstellen. Nur da muss man sich dann um alles, wie das Löschen von diesen, kümmern. Du kannst das mit den Types mit der Ergänzung machen, dass du für jede "Liste" eine Bank erstellst, in der du die Handles der Listen-Einträge speicherst. [Achtung, ich mache für etwas eigenes Werbung. ![]() Ich habe auch eine eigene Lösung für das einfachere Verwalten von Daten mit Banks entwickelt. Damit hätte man einen Type-Ersatz mit der Möglichkeit für mehrere Listen. Siehe mal nach dem "DBPC", wenn du möchtest. [/Werbung] Aber, du müsstest dich dann noch in ein ganz anderes System einarbeiten, daher solltest du vielleicht erst einmal eine eigene Lösung zum Lernen finden. mfG mpmxyz P.S.: Ich war aber lahm. |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Rick_72 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm, habe gerade erst B3D gekauft, da ist BMax erstmal nicht drin. Ich denke, ich werde den Vorschlag von mpmxyz, die Listen quasi "zu drehen" irgendwie verwursten. Schön ist das alles nicht ![]() Vielen Dank für Eure Antworten! |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich finde immernoch am einfachsten ist, beim erstellen eines Parent-Types eine eigene ID zu vergeben und diese auch den Child-Types mit zu geben, damit bin ich bisher immer ganz gut gefahren. | ||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
Rick_72 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@mpmxyz: Ein Precompiler ist ja eine coole Sau! Auf längere Sicht werde ich das wohl nutzen, weil es ziemlich praktisch aussieht. Sauberes Projekt! Respekt. | ||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst dir quasi Linked Lists mit Types nachbauen - ginge dann ungefähr so Code: [AUSKLAPPEN] Type TListItem
Field Prev.TListItem ;eigentliche Type - Daten Field DummyData$ Field Succ.TListItem End Type Local List.TListItem = New TListItem List\DummyData = "Listenkopf" For I = 0 To 5 Local ListItem.TListItem = New TListItem ListItem\DummyData = "Listeneintrag no. " + I List_AddLast( List, ListItem ) Next Local ListIterator.TListItem = List ;For-Each-Schleife While List_GetNext( ListIterator ) <> Null Print ListIterator\DummyData ListIterator = List_GetNext( ListIterator ) Wend WaitKey() End Function List_AddLast( List.TListItem, ListItem.TListItem ) Local LastItem.TListItem = List_GetLast( List ) LastItem\Succ = ListItem End Function Function List_GetLast.TListItem( List.TListItem ) While True If List\Succ = Null Then Return List List = List_GetNext( List ) Wend End Function Function List_GetNext.TListItem( List.TListItem ) Return List\Succ End Function So kann man sich alle Funktionen wie Insert, For-Each, Last, First, Next, Before etc. perfekt nachbauen, wenn man es braucht. Ist manchmal praktischer als ein ID - System |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann auch einen Arrayeintrag von Types reinhängen, finde ich schöner als die Parent-Lösung, und man ist beim Zugriff schneller. (Bei der Parent-Lösung, musst du zuerst alle durchgehn und dir die richtigen raussuchen..)
Code: [AUSKLAPPEN] Type parent
field entry.child[32] end Type Type child field katze field staubsauger end Type p.parent=new parent p\entry[0]=new child p\entry[0]\katze=42 Ich persönlich arbeite immer mit einem Counter und einer Funktion, damit ich es mir nicht alles merken muss. Geht in etwa so: Code: [AUSKLAPPEN] Type parent
field entry.child[32] field cCount end Type Type child field a end Type function addChildToParent(p.parent,c.child) if p\cCount>32 return endif p\entry[p\cCount]=c p\cCount=p\cCount+1 end function function addNewChildToParent(p.parent) if p\cCount>32 return endif p\entry[p\cCount]=new child p\cCount=p\cCount+1 end function Um dann alle Child-Einträge zu finden, kannst du einfach die Liste der entrys mit einer For-Next-Schleife absuchen, bis p\cCount-1. GG, HF |
||
Diese Signatur ist leer. |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist der übliche Kampf Linked List vs. Array ![]() Was man benutzen will, kommt drauf an, für was man es braucht. Bei Linked Lists ist das Zugreifen auf einzelne Elemente eher langsam, während das Löschen und einfügen einzelner Elemente sehr schnell vonstatten geht. Bei einem Array ist der Zugriff auf einzelne Elemente sehr schnell, dafür das Löschen und Einfügen einzelner Elemente sehr langsam, da die nachfolgenenden Elemente im Array alle verschoben werden müssen. In B3D kommt noch das Limit der statischen Blitzarrays hinzu, die sich nicht vergrössern lassen, um neuen Einträgen Platz zu machen; liesse sich aber durch Banks umgehen. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Darths Methode braucht aber immer eine gewisse Menge Speicherplatz.
Selbst ohne Eintrag braucht es die selbe Menge an Speicher. Außerdem kann man nicht mehr Einträge, als man in den Arrays vorgegeben hat, nutzen. Meine Idee mit den Banks hat diese Probleme nicht. Außerdem hat diese Methode den Vorteil, dass man schnell auf bestimmte Einträge zugreifen kann und dass man immer weiß, wie viele Einträge in der Liste sind. mfG mpmxyz Edit: Noobody hat eigentlich alles schon gesagt... |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Rick_72 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt ja alles. Ich erstelle aber zur Laufzeit eine Liste, deren Größe ich nicht kenne. Arrays sind da eher unpraktisch. Mir bleibt also nichts anderes als eine Liste, die ich dann am Ende wohl manuell verwalten muss - leider ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das selbstverwalten der Liste ist nur ein bissel Mehraufwand, der Nutzen jedoch enorm ![]() |
||
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 ![]() |
---|---|---|
Yupp, stimmt. Ich werde das jetzt so machen: ich trenne die Listen (hart) und tracke dann in den ausgelagerten Listen (und der Ursprungsliste; also eine Knotennummer) eine ID mit (ID=Knotennummer). Dann halt bei der Suche brav den Index mit der Knotennummer vergleichen. Hat allerdings den entscheidenen Nachteil, dass ich die ausgelagerten immer komplett abwandern muss, um alle Einträge zu einem bestimmten Knoten rauszusuchen. Naja, die Kiste ist ja schnell genug ![]() Irgendwann gibt's dann Banks .. aber das wird Kür. Erstmal muss das Teil rennen .. und da habe ich noch mindestens 80% vor mir. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group