Показать сообщение отдельно
Старый 12.05.2011, 02:18   #5
Venom2
 
Сообщений: n/a
Ответ: Объект и его связь

metalpasha
Локальных список в блице нет, но можно сделать вручную, например:
Type TNode
	Field Entity%
	Field PrevNode.TNode; ссылка на предыдущий объект в списке
	Field NextNode.TNode; ссылка на следующий объект в списке
End Type

Type TZone
	Field HeadNode.TNode; ссылка на первый объект в списке
	Field TailNode.TNode; ссылка на последний объект в списке
End Type

; добавляет объект в конец списка Zone
Function Zone_AddNode.TNode(Zone.TZone, Node.TNode)
	Node\NextNode = Null
	Node\PrevNode = Zone\TailNode
	If Zone\TailNode <> Null Then
		Zone\TailNode\NextNode = Node
	Else
		Zone\HeadNode = Node
	End If
	Zone\TailNode = Node
	Return Node
End Function

; убирает объект из списка Zone
Function Zone_RemoveNode(Zone.TZone, Node.TNode)
	If Node\PrevNode <> Null Then
		Node\PrevNode\NextNode = Node\NextNode
	Else
		Zone\HeadNode = Node\NextNode
	EndIf
	If Node\NextNode <> Null Then
		Node\NextNode\PrevNode = Node\PrevNode
	Else
		Zone\TailNode = Node\PrevNode
	EndIf
End Function

; создаем зону
Local Zone.TZone = New TZone

; добавляем 4 объекта
Local Node1.TNode = Zone_AddNode(Zone, New TNode)
Node1\Entity = 1
Local Node2.TNode = Zone_AddNode(Zone, New TNode)
Node2\Entity = 2
Local Node3.TNode = Zone_AddNode(Zone, New TNode)
Node3\Entity = 3
Local Node4.TNode = Zone_AddNode(Zone, New TNode)
Node4\Entity = 4

; убираем второй объект
Zone_RemoveNode(Zone, Node2)

; выводим список
Local Node.TNode = Zone\HeadNode
While Node <> Null
	Print(Str(Node\Entity))
	Node = Node\NextNode
Wend

WaitKey()
End
или, если ты заранее знаешь максимальное кол-во объектов в таком списке, используй как уже предлагали массив, например:
Type TNode
	Field Entity%
	Field Slot%; номер ячейки в массиве
End Type

Type TZone
	Field Size%; кол-во объектов в массиве
	Field List.TNode[10]; массив объектов, макс. 10 штук
End Type

; добавляет объект в массив Zone
Function Zone_AddNode.TNode(Zone.TZone, Node.TNode)
	Zone\List[Zone\Size] = Node
	Node\Slot = Zone\Size
	Zone\Size = Zone\Size + 1
	Return Node
End Function

; убирает объект из массива Zone
Function Zone_RemoveNode(Zone.TZone, Node.TNode)
	Zone\Size = Zone\Size - 1
	Zone\List[Node\Slot] = Zone\List[Zone\Size]
End Function

; создаем зону
Local Zone.TZone = New TZone

; добавляем 4 объекта
Local Node1.TNode = Zone_AddNode(Zone, New TNode)
Node1\Entity = 1
Local Node2.TNode = Zone_AddNode(Zone, New TNode)
Node2\Entity = 2
Local Node3.TNode = Zone_AddNode(Zone, New TNode)
Node3\Entity = 3
Local Node4.TNode = Zone_AddNode(Zone, New TNode)
Node4\Entity = 4

; убираем второй объект
Zone_RemoveNode(Zone, Node2)

; выводим массив
Local Slot%
For Slot = 0 To Zone\Size - 1
	Local Node.TNode = Zone\List[Slot]
	Print(Str(Node\Entity))
Next

WaitKey()
End
 
Ответить с цитированием