Type in Type liefert unerwartetes Ergebnis

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Rick_72

Betreff: Type in Type liefert unerwartetes Ergebnis

BeitragDi, Aug 18, 2009 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 18, 2009 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Field x
End Type
Type Upper
Field Parent.down ;Das gibt an, zu welcher "Liste" der Eintrag gehört.
Field z
End Type

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

BeitragDi, Aug 18, 2009 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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.. Neutral

Xeres

Moderator

BeitragDi, Aug 18, 2009 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mpmxyz

BeitragDi, Aug 18, 2009 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink]
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

BeitragDi, Aug 18, 2009 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile wird aber irgendwie schon hingebastelt!

Vielen Dank für Eure Antworten!

skey-z

BeitragDi, Aug 18, 2009 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

Rick_72

BeitragDi, Aug 18, 2009 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDi, Aug 18, 2009 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 18, 2009 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 18, 2009 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist der übliche Kampf Linked List vs. Array Razz
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

BeitragDi, Aug 18, 2009 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 18, 2009 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad

BladeRunner

Moderator

BeitragDi, Aug 18, 2009 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das selbstverwalten der Liste ist nur ein bissel Mehraufwand, der Nutzen jedoch enorm Smile
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

BeitragDi, Aug 18, 2009 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Irgendwann gibt's dann Banks .. aber das wird Kür. Erstmal muss das Teil rennen .. und da habe ich noch mindestens 80% vor mir. Confused

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group