Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 2D-программирование

2D-программирование Вопросы, касающиеся двумерного программирования

Ответ
 
Опции темы
Старый 19.04.2012, 02:09   #1
kostya261
AnyKey`щик
 
Регистрация: 27.08.2007
Сообщений: 17
Написано одно полезное сообщение
Связанные списки?...

Проясните один момент пожалуйста.

Хочется освоить работу со связанными списками.
Но вот в чем заминка.

Имеем например: Список second и Список first
In first type включаем second type

Вопрос в следующем, вне зависимости сколько раз я создам первый список и в нем второй, содержимое второго все равно будет в общей куче второго списка, а не принадлежать свеже созданному списку first?

Блин... изложил как сумел. Поймите кто нибудь мои непонятные мысли.
(Offline)
 
Ответить с цитированием
Старый 19.04.2012, 02:15   #2
kostya261
AnyKey`щик
 
Регистрация: 27.08.2007
Сообщений: 17
Написано одно полезное сообщение
Ответ: Связанные списки?...

Например нужно получить следующее:
Создаем список Window с набором параметров, такие как координаты, размер, ну и др. мишура.
Дальше для этого окна создаем вторым (связанным) списком набор гаджетов (кнопки, флажки, текст боксы и пр. мишура).

Вот здесь и хотелось бы, чтобы гаджеты и прочая мишура второго списка принадлежали бы только своему окну, а не висели кучей в списке номер 2.

Вообще не могу понять, в чем смысл например таких записей:

one.list = new list
one\параметр = что нибудь
one.list = new list
one\параметр = другое что нибудь

two.list = new list
two\параметр = что нибудь

если например

for one.list = each list
print one\параметр
next

в итоге выдаст полностью все содержимое списка и с указателем one и указателем two.
для чего тогда нужны указатели?

Конечно я мог бы например во втором списке завести переменную куда бы записывал handl первого списка, (ну типа только моё), но тогда у меня в голове теряется смысл связанных списков. Можно вести таким же образом два независимых списка.

В общем идея связанных списков на мой взгляд ГЕНИАЛЬНАЯ, но пока в меру своей ограниченной не просвятленности, реализация таковых мне кажется туповатой.
structure в Си как то почетче...
(Offline)
 
Ответить с цитированием
Старый 19.04.2012, 08:49   #3
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Связанные списки?...

two и one это указатели на элемент списка.

for one.list = each list
тут каждый шаг цикла one присваивается какой то элемент списка, по порядку.
one это только название, вместо него можно было бы прописать что угодно.

Если хочеш два разных списка, то
либо создаешь 2 списка
type window
field lol
endtype

type gadjeti
field lol
endtype

и работаеш с тем который тебе нужен сейчас.

либо делаеш один, но
type window
field ListType
field lol
endtype

Если у тя гаджет, то присваиваеш ListType=1, если виндоус, то присваиваш ListType=0.

for one.window = each window
if ListType=0
print window\lol
endif
next
(Offline)
 
Ответить с цитированием
Старый 19.04.2012, 08:50   #4
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Связанные списки?...

Можно сделать свои собственные связные списки.
Я сделал двусвязный список с добавлением данных в конец, можно пробегать с начала до конца и с конца до начала.
Вставку в начало и удаление элемента добавить легко и просто.
Вместо знакомого For ... Each ... Next здесь получаем
link = first link
while link <> null
....
link = next link
wend

Вот мой примерчик кода:

SeedRnd(MilliSecs())

Local list1.TList = fnListCreate()
Local list2.TList = fnListCreate()

Local d.TData, p.TParam, k%
For k% = 1 To 5
	d = New TData
	d\txt = "1st list, data №"+k
	p = New TParam
	p\andle = Rnd(0,360)
	p\name = Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))
	d\param = p
	fnListAdd(list1, Handle(d)) ;добавляем в первый список
Next

For k% = 1 To 3
	d = New TData
	d\txt = "2nd list, data №"+k
	p = New TParam
	p\andle = Rnd(0,360)
	p\name = Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))
	p\kind = Rand(10)
	d\param = p
	fnListAdd(list2, Handle(d)) ;добавляем во второй список
Next


Graphics 600,600,0,2

SetFont(LoadFont("Arial Cyr", 16))


Local link.TLink, y% = 10

;проход по первому списку
link = fnListFirstLink(list1)
While(link <> Null)
	d = Object.TData(link\objPtr) 
	y = fnDataPrint(d, 10, y)
	y = y + 10
	link = fnNextLink(link)
Wend

;проход по второму списку
link = fnListFirstLink(list2)
y = 10
While(link <> Null)
	d = Object.TData(link\objPtr) 
	y = fnDataPrint(d, 200, y)
	y = y + 10
	link = fnNextLink(link)
Wend

;проход по второму списку c конца
link = fnListLastLink(list2)
y = 10
While(link <> Null)
	d = Object.TData(link\objPtr) 
	y = fnDataPrint(d, 400, y)
	y = y + 10
	link = fnPrevLink(link)
Wend

WaitMouse

End



Function fnListCreate.TList()
	Local list.TList = New TList
	;list\root = New TLink
	Return list
End Function

Function fnListAdd.TLink(list.TList, dataPtr%)
	Local newLink.TLink = New TLink
	newLink\objPtr = dataPtr ;в качестве данных храним указатель на тип с данными, Handle
	If(list\firstLink = Null) 
		list\firstLink = newLink ;запоминаем первый элемент
		list\lastLink = newLink
	Else
		Local lastLink.TLink = list\lastLink
		lastLink\nextLink = newLink
		newLink\prevLink = lastLink
		list\lastLink = newLink
	EndIf
	list\count=list\count+1
	Return newLink
End Function

Function fnListIsEmpty%(list.TList)
	Return (list\count = 0)
End Function

Function fnListFirstLink.TLink(list.TList)
	Return list\firstLink
End Function

Function fnNextLink.TLink(link.TLink)
	Return link\nextLink
End Function

Function fnListLastLink.TLink(list.TList)
	Return list\lastLink
End Function

Function fnPrevLink.TLink(link.TLink)
	Return link\prevLink
End Function


Function fnDataPrint%(d.TData, x=0, y=0)
	Local fh% = FontHeight()
	Text x,y, d\txt+" {"
	Text x,y+fh, "  name: "+d\param\name
	Text x,y+2*fh, "  kind: "+d\param\kind
	Text x,y+3*fh, "  x,y,z: "+d\param\x+","+d\param\y+","+d\param\z
	Text x,y+4*fh, "  angle: "+d\param\andle
	Text x,y+5*fh, "}"
	Return y+6*fh
End Function



Type TList
	Field count%
	Field firstLink.TLink
	Field lastLink.TLink
End Type

Type TLink
	Field objPtr%
	Field nextLink.TLink
	Field prevLink.TLink
End Type

Type TData
	Field txt$
	Field param.TParam
End Type

Type TParam
	Field x#,y#,z#
	Field andle#
	Field kind%
	Field name$
End Type


UPD: т.к. в качестве данных хранится Handle, то хранить можно любые данные Type.
Не знаю насколько быстро работает d = Object.TData(link\objPtr), наверное быстро.
Миниатюры
Нажмите на изображение для увеличения
Название: list.png
Просмотров: 919
Размер:	17.0 Кб
ID:	16667  
(Offline)
 
Ответить с цитированием
Старый 19.04.2012, 13:57   #5
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Связанные списки?...

Самая отличная статья увиденная мной про списки. Что б понять как организовано именно связь между списками мне пришлось прочитать статью раза три в свое время. Но если понять, таких проблем как у тебя появляться больше не должно:
Журнал Blitz Et Cetera - Связанные списки в Blitz3D
п.с. И вообще.... Советую почитать в этом журнале больше чем эту статейку...
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:08.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com