|
22.04.2011, 19:31
|
#1
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Послдений не Null в списке
Подскажите пожалуйста, как мне из списка получить первый, не-нулевой предыдущий элемент.
current:mytype=mytype(ListFindLink(mylist,current) .prevlink().value())
Вот такой код работает отлично, пока из середины списка что-нибудь не пропадет.
К примеру у меня 4 экземпляра типа, current в данный момент 4, а 3 удаляется (т.е. listremove()), если попытатся выполнить данный код, то вылетает с ошибкой доступа к Null элементу. А надо чтобы просто проскачил на 2 элемент.
Надеюсь понятно объяснил.
|
(Offline)
|
|
22.04.2011, 21:24
|
#2
|
|
Ответ: Послдений не Null в списке
Сообщение от NitE
Подскажите пожалуйста, как мне из списка получить первый, не-нулевой предыдущий элемент.
current:mytype=mytype(ListFindLink(mylist,current) .prevlink().value())
Вот такой код работает отлично, пока из середины списка что-нибудь не пропадет.
К примеру у меня 4 экземпляра типа, current в данный момент 4, а 3 удаляется (т.е. listremove()), если попытатся выполнить данный код, то вылетает с ошибкой доступа к Null элементу. А надо чтобы просто проскачил на 2 элемент.
Надеюсь понятно объяснил.
|
Лучше у каждого экземпляра MyType хранить ссылку TLink на добавляемый элемент. Тогда не надо будет использовать медленный ListFindLink, который для поиска перебирает список, и заодно решается описаная тобой проблема:
Framework BRL.Blitz
Import BRL.LinkedList
Type MyType
Field Link : TLink
End Type
Local MyList : TList = CreateList()
Local Element1 : MyType = New MyType
Element1.Link = ListAddLast(MyList, Element1)
Local Element2 : MyType = New MyType
Element2.Link = ListAddLast(MyList, Element2)
Local Element3 : MyType = New MyType
Element3.Link = ListAddLast(MyList, Element3)
Local Element4 : MyType = New MyType
Element4.Link = ListAddLast(MyList, Element4)
Local CurrentElement : MyType = Element4
ListRemove(MyList, Element3)
CurrentElement = MyType(CurrentElement.Link.PrevLink().Value())
If CurrentElement <> Element2 Then RuntimeError("Oh shit!")
End
Естественно PrevLink() надо проверять на Null, вдруг текущий элемент окажется первым.
|
|
|
Сообщение было полезно следующим пользователям:
|
|
22.04.2011, 22:18
|
#3
|
|
Ответ: Послдений не Null в списке
Опупеть...
Списки это удобный контейнер - итератор. Но чтобы ТАК извергаться над списками? заЧем? чем вас массивы не устраивают? мнгновенный индексный доступ без всяких линков...
|
|
|
22.04.2011, 23:03
|
#4
|
|
Ответ: Послдений не Null в списке
Сообщение от Diablo1909
Но чтобы ТАК извергаться над списками?
|
Так это как?
Сообщение от Diablo1909
чем вас массивы не устраивают?
|
Каким боком массивы имеют отношение к описываемой проблеме?
Сообщение от Diablo1909
мнгновенный индексный доступ без всяких линков...
|
А если нужно сохранять порядок при удалении элементов? Сортировать каждый раз будешь? Или может быть удалять смещением блока памяти, что тоже не дешево?
Для каждой задачи свой контейнер, непонятно вообще к чему твоя мессага.
|
|
|
22.04.2011, 23:27
|
#5
|
|
Ответ: Послдений не Null в списке
Во мля... вы просто массивы юзаете как ламеры.
|
|
|
22.04.2011, 23:43
|
#6
|
|
Ответ: Послдений не Null в списке
Сообщение от Diablo1909
Во мля... вы просто массивы юзаете как ламеры.
|
Как был ты клоуном, так и остался :D
|
|
|
23.04.2011, 00:26
|
#7
|
|
Ответ: Послдений не Null в списке
Для особо одаренных...
Global mass%[] = New Int[4]
Const NULL_ITEM% = -1 ' обьявляем *Null* переменную
MemCopy(mass, [1,2,3,4], 4*4) ' инициализируем
' 1) Удаляем 3-й элемент :
mass[2] = NULL_ITEM
' 2) Адекватный перебор с учетом удаленного
For Local i% = 0 Until mass.Length
If mass[i] = NULL_ITEM Then Continue
....
Next
PS Стандартный TList - оцтой тот еще. Ты глянь на исходник его... он как мамонт жрет память и проц. Листы вообще придуманы ламерами и для ламеров - это жуткое зло - лист плодит кучу однотипных ссылок которые к тому же пересекаются и снаружи никак нельзя проконтролировать их, что чревато утечками памяти и тому подобными весельями, так как БМакс не умеет такие ссылки обрабатывать. Серия Quake 1-3 полностью реализована на массивах (насчет 4-й незнаю, но скорее всего тоже). в Unreal тоже не увидишь ни одного листа (их тама просто нет). В 99.9% листы ненужны вообще, возможностей массивов хватает слихвой и везде ( в крайнем случае можно эмитировать список односторонним указателем).
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
23.04.2011, 02:00
|
#8
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: Послдений не Null в списке
а что правда если что то удаляется то оно Всегда превращяется в -1 ??
|
(Offline)
|
|
23.04.2011, 12:50
|
#9
|
|
Ответ: Послдений не Null в списке
Сообщение от IGR
а что правда если что то удаляется то оно Всегда превращяется в -1 ??
|
Это не так критично. Пустые переменные как правило весят не больше 4 байт, поэтому лишняя тысяча в массиве не окажет серьезной нагрузки на систему (в отличие от листов, которые затормозят все что можно). Перебор массива по индексам (тоесть через For i%=0 Until mass.Length) происходит гораздо быстрее чем перебор листа. Доступный перебор ( тоесть For i% = EachIn mass ) по скорости такой же медленный как и листы, там за цикл происходит 2 вызова методов. Первый вариант предпочтительней, но в то же время на Ваши плечи ложится забота чтобы не вылететь за пределы массива. Более того, эти пустые ячейки массива можно заюзать позже при добавлении нового элемента, причем можно добавлять куда угодно, хоть в начало хоть в конец или в середину. Ну и в крайнем случае массив можно почистить после некоторых манипуляций над ним.
|
|
|
26.04.2011, 01:22
|
#10
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Послдений не Null в списке
Diablo1909, подкинешь статей (или сам напишешь)) ) про то как надо массивы по-отцовски юзать ? Будем учиться.
(Вот в данный момент например непонятно как из кастомного массива что-либо удалить. myarr:mytype[x]=-1 естественно кидает cannot convert int to mytype. Вот и хз как быть.)
|
(Offline)
|
|
26.04.2011, 12:11
|
#11
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Послдений не Null в списке
HandleFromObject
HandleToObject
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.04.2011, 12:58
|
#12
|
|
Ответ: Послдений не Null в списке
2Nite
в массивах должна хранится однотипная информация, числа с числами, обьекты с обьектами.
В примере компилятор тебе говорит что "не могу сконвертить целое число в тобою обьявленный mytype"
Так как массив обьявлен у тебя как содержащий некие обьекты, то пишем так :
Насчет статьи хз. Глянь лучше на исходники HGE (Партиклы). Там есть пример как юзать массивы с максимальной выгодой.
|
|
|
Сообщение было полезно следующим пользователям:
|
|
04.05.2011, 22:19
|
#13
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Послдений не Null в списке
Diablo1909, можно поподробней как не вылететь за пределы массива ?
А то ведь For i%=0 Until mass.Length значит, что он строго до длинны массива перебирает, но у меня почему-то если поменять размер массива (например укоротить его слайсом) то пишеть типа вылетел за предел.
|
(Offline)
|
|
05.05.2011, 00:17
|
#14
|
|
Ответ: Послдений не Null в списке
После переразметки массива, он должен корректно возвращать длинну ( по сути это создание нового массива с новой длинной ), поэтому здесь косяков быть не должно.
Телепаты в отпуске, так что код с косяком в студию, посморим что у тебя тама.
ЗЫ Слайсы - в топку, тоже вещь очень медленная.
|
|
|
Сообщение было полезно следующим пользователям:
|
|
05.05.2011, 00:58
|
#15
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Послдений не Null в списке
Решил проблему отказавшись от слайсов. Спасибо.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:43.
|