problem with lists
BlitzMax Forums/BlitzMax Programming/problem with lists
| ||
| I am trying to seperate the p1 and the p2 lists... I want p1 to contain values 0-10 and p2 to contain values 11-20. Running this code prints the following: ------------- p1 list ------------- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ------------- p2 list ------------- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Here is the code: Strict Global p1:TParent Global p2:TParent Type TParent Global list:TList Global child:TChild Method New() If list = Null Then list = New TList list.addlast Self EndMethod Method destroy() list.remove Self EndMethod EndType Type TChild Global list:TList Field val:Int Method New() If list = Null Then list = New TList EndMethod Method destroy() list.remove Self EndMethod EndType For Local i = 0 To 10 p1:TParent = New TParent p1.child = New TChild p1.child.val = i p1.child.list.addlast p1.child Next For Local i = 11 To 20 p2:TParent = New TParent p2.child = New TChild p2.child.val = i p2.child.list.addlast p2.child Next Print "------------- p1 list -------------" For p1.child = EachIn p1.child.list Print p1.child.val Next Print "------------- p2 list -------------" For p2.child = EachIn p2.child.list Print p2.child.val Next |
| ||
| The Global list:TList exists only to put each created object into a single list for that type. Global applies to the type as a whole. What you probably want to do is to create a parent type that contains a list of children which will be a Field. Then create instances p1 and p2 and add ten children to each list. Strict Global p1:TParent Global p2:TParent Type TParent Global list:TList Field children:TList Method New() If list = Null Then list = New TList list.addlast Self EndMethod Method destroy() list.remove Self EndMethod Method AddChild(child:TChild) If children = Null Then children = New TList children.AddLast child EndMethod EndType Type TChild Global list:TList Field val:Int Method New() If list = Null Then list = New TList EndMethod Method destroy() list.remove Self EndMethod EndType Local child:TChild p1 = New TParent For Local i = 0 To 10 child = New TChild child.val = i p1.AddChild(child) Next p2 = New TParent For Local i = 11 To 20 child = New TChild child.val = i p2.AddChild(child) Next Print "------------- p1 list -------------" For child = EachIn p1.children Print child.val Next Print "------------- p2 list -------------" For child = EachIn p2.children Print child.val Next You could directly access the list of children and do say 'p1.children.AddLast(child)' rather than 'p1.AddChild(child)' but I'd prefer not to directly access (to update) the fields of TParent. There may be other work to be added later to maintain the fields and direct access makes that more work and more error prone. This is a slightly different version:
Strict
Global p1:TParent
Global p2:TParent
Type TParent
Global TypeList:TList
Field Name:String
Field Children:TList
Method New()
If TypeList = Null Then TypeList = New TList
TypeList.AddLast(Self)
children = New TList
EndMethod
Function CreateParent:TParent(name:String)
Local this:TParent = New TParent
this.Name = name
Return this
EndFunction
Method AddChild(child:TChild)
children.AddLast child
EndMethod
Method AddChildValue(val:Int)
Local child:TChild = TChild.CreateChild(val)
children.AddLast(child)
EndMethod
Method PrintChildren()
Print "------------- Children of " + Name + " -------------"
Local child:TChild
For child = EachIn children
Print child.Val
Next
EndMethod
EndType
Type TChild
Field Val:Int
Function CreateChild:TChild(val:Int)
Local child:TChild = New TChild
child.Val = val
Return child
EndFunction
EndType
' Initialisation
Local child:TChild
p1 = TParent.CreateParent("P1")
For Local i = 0 To 10
p1.AddChildValue(i)
Next
p2 = TParent.CreateParent("P2")
For Local i = 11 To 20
p2.AddChildValue(i)
Next
Local parent:TParent
For parent = EachIn TParent.TypeList
parent.PrintChildren()
Next
Note that I have removed the list maintenance from within TChild as it is not required. The parent instances maintain lists of their children. Generally I do implement the type list maintenance but for illustration you can see that it is optional. |
| ||
| PGF, thank you for taking the time to provide such a thorough example! This has clarified a lot. |
| ||
| If you haven't already done so, I suggest that you go back and look at your original code. Explain to yourself why it did what it did. Then you'll really 'get it'. For example: - How many TParent objects did you create ? - Where did the others go to ? - Why did both lists print out the same contents ? - Are they in fact different lists ? Cheers. |