NCrashed
offline
Опыт:
13,553Активность: |
[cJass] Списки ака динамические массивы
Введение Удивительно, что в джаззе изначально нету ни многомерных массивов ни динамических массивов. Я решил устранить второй недостаток. Реализовано на структурах и новых фичах cJass'а, поэтому многим будет просто полезно изучить систему для более полного представления, как можно пользоваться дефайном, условной трансляцией, сокращенной записью функций и т.п. Ввиду стандартных ограничений структур, для каждого типа списков макс. число элементов равно 8192. Выбор организации структурами связан с несовместимостью 23 и 24 версий вара и быстродействием структур.
Особенности
Области применения
А что такое список 0.o? Список - структура для хранения информации, состоящий из элементарных ячеек. В каждой ячейке есть непосредственное полезное значение и указатель на следующую ячейку. Обычно хранят только "голову" списка.
Список функцийlist.Create(int k) - создает список/первую ячейку со значением k
list.AddHead(type m) - добавление в голову списка, обязательно надо переназначить голову!! list = list.AddHead(m) list.AddTail(type m) - Добавление в хвост списка list.Head() - Возвращает значение головы списка list.Last() - Возвращает значение последнего элемента списка list.Begin()- Создает список, в который копируются все элементы, кроме последнего list.Tail() - Создает список, в который копируются все элементы кроме первого list.Copy() - Создает список, в который копируются все элементы из старого list.Length() - Возвращает длину списка list.Member(type m) - Возвращает тру, если элемент m есть в списке list.DelElement(type m) - Удаляет первый элемент m, не удаляет голову, возвращает false при неудаче list.DelHead() - Удаляет голову list.DelTail() - Удаляет последний элемент list.Destroy() - Уничтожение списка
» Код системы
Особые благодарностиПроекту XGM и создателям cJass'а. Без дефайна получилось бы не так красиво.
История версий1.1
Отредактировано NCrashed, 11.10.2009 в 12:52. |
||||||||||||
09.10.2009, 21:09 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
И молчание... ну хоть какую нибудь критику отписали. |
10.10.2009, 14:22 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
Мало кому пригодится.. вот avl-деревья было бы поинтересней) |
10.10.2009, 14:27 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
я бы с удовольствием отписался, но дико занят войной с вексом=) мб чуточку позже?
кстате, неплохобы с самой библиоткой представлять карту - демку. я же надеюсь это расчитано на подключение инклюдом? |
10.10.2009, 14:41 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JamesBlack
black mind
offline
Опыт:
6,595Активность: |
Списки это, конечно, очень хорошо... Только не думаю, что они так уж часто пригодятся. Хотя уже пару идей в голове есть, в каких случаях их можно использовать, но они довольно нетривиальны.
[off]Вот если бы кто-нибудь дал работать с памятью... указателями... Можно было б горы свернуть!..[/off] |
10.10.2009, 14:57 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Dark Dragon писал начто подобное (но понятно что средствами жасса), только вот где оно - хз |
10.10.2009, 15:04 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
ScorpioT1000, а где в варе авл дерево может пригодиться? ADOLF, подключается инклудом, собственно для наглядного теста нужно будет еще спелл экзотический написать, попробуем. А с указателями, наверняка, под 23 версию написано с рб. |
10.10.2009, 15:53 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
Мой любимый вопросс: Зачем это ?
вроде бы у векса есть статичные, динамические массивы, этого мало ? -_- |
11.10.2009, 11:38 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
про динамические я не слышал, вот статичные у него точно есть.
В областях применения написано, а так чтобы просто было. Главная идея - теоретическая неограниченность списка (из-за структур на каждый тип списков отводится 8196 ячеек), то есть можно использовать в моей же FDL, где для хранения тел используются массивы с ограниченным объемом, а со списками этот тонкий момент можно обойти. +Прекрасный метод использования дефайна - легкая организация наследования методов. |
11.10.2009, 11:47 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
NCrashed:
А не 8192) плз выложи код в первом посте под катом ) |
11.10.2009, 12:08 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Я вот посмотрел и возник один вопрос: Раньше типы "список" и "элемент списка" были разные. Я так сильно устарел или сейчас так модно? |
11.10.2009, 12:09 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
Хмм, а зачем делать отдельный тип для головы списка, если она сама является элементом списка, вообще за голову списка можно взять любой элемент из цепочки, только предыдущие элементы потеряются. Список определяется как последовательность элементов, в которых есть основная часть и ссыль на следующий элемент. У меня списки однонаправленные и некольцевые
ZeToX2007, да 8192, ошибся. сейчас выложу |
11.10.2009, 12:17 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Собственно по большей части затем, чтобы избежать
и ещё Значит, чтобы удалить кого-то из списка я должен проверять, голова он или нет. Нехорошо. |
11.10.2009, 12:33 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
То есть ты предлагаешь создать отдельную структуру - голова списка, в которой есть только ссыль на первый элемент? Тогда мы лишаемся уникальной возможности назначать головой любой из элементов в середине списка.
Специально определили процедуру (кстати процедуры с одним параметром реализуемы только в cJass), чтобы скрыть эту особенность. Согласен, что нехорошо. Исправляется одним движением руки, сейчас поправлю NCrashed добавил:
оплошность исправлена 1 оператором, версия обновлена
|
11.10.2009, 12:51 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Да, я забыл спросить ещё, почему ты не используешь thistype ?
А ты на практике проверил, что твоё исправление действительно убирает голову?
Очень сомневаюсь. ...теряя всё, что до головы или путая списки между собой. Я и не говорю, что этот способ плохой, просто он имеет неприятные особенности. |
11.10.2009, 13:01 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
На практике проверена функция удаления головы и старая удаления из середины, поводов для багов в новой нет. А кто сказал, что мы переназначим при этом переменную , в которой хранилась голова? Можно завести указатель на середину списка, не теряя при этом первую половину Списки не для новичков. Ответственность за утерю головы на совести программиста. Излишнее упрощение приводит только к потере возможностей и понимания истинного положения вещей (яркий пример VCL Delphi) |
11.10.2009, 14:10 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
NCrashed:
В новую функцию указатель this передаётся по значению, соответственно указатель головы она поменять не может никак. Проверь. И удаляя элемент из одного списка ты можешь удалить его и из дгугого. А что будет, если ты удалишь у другого списка голову? 8-( Да понятно, что всё на совести програмиста... Но тот, кто в твоей системе разберётся, и сам может такое сделать. И в любом случае, молодец, что стараешься! :)
пс. В теме про движение ты мне так и не ответил. |
11.10.2009, 16:05 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
Цитата:
|
|
12.10.2009, 01:50 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
вообще-то между списком и массивом есть разница - список, в отличие от массива сам для себя выделяет память и копирует содержимое, но, вообще говоря, списки практически бесполезны, особенно в данном случае, ибо есть массивы, а вот обьекты типа map и hashmap куда полезнее и интересней с точки зрения программирования |
12.10.2009, 11:45 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
какой хэшмэп ? на что ты его повесишь, никакого побитового функционала близзы нам не предоставили.. |
12.10.2009, 19:18 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|