XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Хендл юнита как индекс?
Безопасно ли использовать хендл юнита как индекс для массивов? Т.е. вместо использования ХТ, хранить данные в массиве с индексом объекта.
Пример:
local unit u = GetEnumUnit()
local integer i
set i = GetHandleId(u)
set udg_a[i] = 0.00
set udg_b[i] = 0.00
Старый 20.07.2010, 18:30
reALien

offline
Опыт: 29,211
Активность:
Faion, нельзя юзать, ибо максимальный номер слота - 8192, а хендлы бывают гораздо больше.
Старый 20.07.2010, 19:06
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Есть ли какой то способ воплотить что то подобное?) Или же самый оптимальный вариант хранить по ссылке индекс который создан будет. Просто сам думаю знаешь, хт медленно работает, а мне необходимо хранить 8 реальных чисел отдельно для каждого юнита, и возможно таких юнитов будет не 12, а за сотню.
Старый 20.07.2010, 19:08
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
Faion:
хт медленно работает,
чушь
Старый 20.07.2010, 19:12
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Жаль удалил ответ в пм ТК, но он сказал что массив > ХТ, и если не ошибаюсь, то он добавил что чувствительно медленнее.
Старый 20.07.2010, 19:16
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
Блин. Ты ощущаешь разницу между "медленно" и "медленней, чем массив"? Сам додумаешься?
Старый 20.07.2010, 19:17
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Если бы не ощущал разницу, не задавал бы вопроса, и реализовал бы все и с использованием ХТ=)
Тему можно закрыть, т.к. ответ на интересующий вопрос получен.
Старый 20.07.2010, 19:19
ScorpioT1000
Работаем
online
Опыт: отключен
да не намного медленней, хотя с версией 1.24 всё стало гораздо медленней из-за hashtable. там у тодди помимо обращения к ячейке, ещё вызов этих убогих функций хештейбла + 5-10 проверок нужного айди массива
ScorpioT1002 добавил:
ну кароче в цикле лучше его не юзать)
Старый 21.07.2010, 07:33
AlexeiK

offline
Опыт: 257
Активность:
если хендл содержит например 8 цифр ,то
сделай два массива и разрежь число пополам.
значение как собрать думаю ясно, и поиск тоже ясен.
конечно при трех массивах утебя максимум будет 819 281 928 192 :)

Отредактировано Enein, 26.08.2010 в 21:17.
Старый 26.08.2010, 18:58
ScorpioT1000
Работаем
online
Опыт: отключен
не надо ничего резать, надо просто вычесть число, с которого начинается отсчёт
Старый 27.08.2010, 16:00
silumin

offline
Опыт: 11,153
Активность:
Faion, в этой теме я поднимал такойже вопрос. Там есть и ответ.
Старый 27.08.2010, 16:08
JassMan
свободен
offline
Опыт: 4,193
Активность:
У меня хеш таблица всему голова, и не такая уж она медленная. Да глобалки быстрее с массивами но не значительно.
Старый 27.08.2010, 17:46
AlexeiK

offline
Опыт: 257
Активность:
Хай всем
и модераторам тоже :)
мой алгоритм о хранение чисел с адресацией по
индексам надеюсь в этот раз выживет
как же хочется на это надеятся :)
Сейчас соберусь с мыслями
Лимит у этой задачи отсуствует и
ограничен только наверное jass лимитами по
хранению коллекции массивов в карте.
тут есть тема, как создать массив у которого бы индекс поддерживал размерность хендла.
я решил обобщить одно из решений для того вопроса.
вот теория:
например хендл имеет значение 123456789
1.создаем 9 массивов, каждый массив индексирует до 8291 элементов.
2.режем число посимвольно, по 1 символу.
3.ищем индекс в первом массиве ставим 1,во втором и ставим 2 и так до 8 массива. 4. в девятом массиве нужно записать значение ,которое требуется
сохранить.
вот сосбтвенно и все.
конечно я тут не даю jass функции, извлечения значения, но напишу словами:
функция принимает один аргумент, это число в виде текста.
дальше по очереди из 9 массивов, в 9 локальных переменных по очереди выгружаются значения.
если в какой то из первых 8 переменных значение не равно 1,то означает такого числа нету и функция должна возвратить nothing.
если же в первых 8 значение единица и в 9 значение не nothing ,то возвращаем значение 9 локальной переменной.
стоит учесть ,что тут пример для девятизначного числа.
в случае меньших чисел, возвращать значение нужно будет не 9 локальной переменной, а длинастроки(моедлиннойчисло)-локальная переменная.
удаление цифры из массива, делается еще проще, всего лишь надо занулить значение в первом массиве.
стоит также учесть, что образно, все числа записываются в эти N-массивов слева направо.
ну вот, думаю , кто нито сделает обертку через jass.
конечно, наличие хэшей возможно перечеркивает на корню, такие алгоритмы.
ScorpioT1000, ты прав, можно или вычислять или прибавлять.
в любом случае придется через функцию определять куда записать.
Старый 30.08.2010, 16:07
silumin

offline
Опыт: 11,153
Активность:
Цитата:
Сообщение от AlexeiK
можно или вычислять или прибавлять.

Нужно именно вычитать!
AlexeiK, без обид, но твой способ - лишний гемморой. Использовать хендл объекта в качестве индекса массивов - просто обалденная вещь, уже проверено.

п.с. правда пришлось много чего переписать.
Старый 30.08.2010, 21:45
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Офигеть просто))
А зачем использовать хендл юнита как индекс массива, если хендл юнита можно использовать как индекс хеш-таблицы.. в ней происходит все тоже самое: ваше число поиском (не тупым перебором, а быстрым) ищется в таблице, и вытаскивается результат.. хеш-таблицы и придуманы чтобы быстро вести поиск, причем это вшито в движок.. а вы тоже самое интерпретатором хотите получить, зачем?
Старый 30.08.2010, 22:49
ScorpioT1000
Работаем
online
Опыт: отключен
это работало когда был рб, а сейчас нельзя получить номер хендла независимо от версии, так что расслабьтесь
Старый 31.08.2010, 00:13
AlexeiK

offline
Опыт: 257
Активность:
Alex_Hell, тут ошибка у тебя для хэщ таблиц.
у них ключ, в данном случае твой хендл, хэшируется по какому то алгоритму,чтобы получить уникальный идентификатор.
быстрота хэш массива зависит, как раз от алгоритма который хэширует ключ.
думаю даже хэш ключа нигде не хранится, а просчитывается при каждом обращении к массиву.
на цифрах может и быстро хэштаблица пашет, а ты попробуй текстовые ключи или другого содержания.
то есть ты ввел ключ типа "12323232" , алгоритм хэша , хэширует его ,получает хэш,
что есть индекс, делает смещение и выдает результат.
в массивах,ты ввел индекс и без вычислений хэша получил результат, так как индекс это смещение от указателя массива.
и соотвественно, даже мой способ, он реально геморный, пока нету обертки на jass , будет быстрее чем хэш таблица, особенно на слабых компах,это будет чувствоваться.
теперь представь, какой код может хэшировать эти 10 байт из которых состоит хэндл? их надо разобрать, произвести математические операции и только тогда, получить индекс массива и уже обратиться за значением.

Отредактировано AlexeiK, 31.08.2010 в 11:07.
Старый 31.08.2010, 10:45
ScorpioT1000
Работаем
online
Опыт: отключен
там нехитрые побитовые операции, которые выполняются за один процессорный такт
Старый 31.08.2010, 11:20
AlexeiK

offline
Опыт: 257
Активность:
ScorpioT1000,
да ты не так делай.
ты код ассемблерный покажи этой фукнции ,чтобы сразу стало все ясно.
Старый 31.08.2010, 12:10
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
имхо структуры рулят =)
Код:
struct obj
 static obj array All
 static integer count = 1
 integer id
 ...
 static method New ...
  local obj this = obj.create()
  set .id = .count
  set .All[.id] = this
  set .count = .count + 1
  ...
 endmethod
 method delete ...
  set .count = .count - 1
  set .All[.id] = .All[.count]
  set .All[.id].id = .id
  ...
 endmethod
endstruct
Старый 31.08.2010, 17:17
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 21:49.