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 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
reALien
offline
Опыт:
29,211Активность: |
Faion, нельзя юзать, ибо максимальный номер слота - 8192, а хендлы бывают гораздо больше. |
20.07.2010, 19:06 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
Есть ли какой то способ воплотить что то подобное?) Или же самый оптимальный вариант хранить по ссылке индекс который создан будет. Просто сам думаю знаешь, хт медленно работает, а мне необходимо хранить 8 реальных чисел отдельно для каждого юнита, и возможно таких юнитов будет не 12, а за сотню. |
20.07.2010, 19:08 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Артте
Open up your eyes
offline
Опыт:
23,373Активность: |
Faion:
чушь |
20.07.2010, 19:12 | #4
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
Жаль удалил ответ в пм ТК, но он сказал что массив > ХТ, и если не ошибаюсь, то он добавил что чувствительно медленнее. |
20.07.2010, 19:16 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Артте
Open up your eyes
offline
Опыт:
23,373Активность: |
Блин. Ты ощущаешь разницу между "медленно" и "медленней, чем массив"? Сам додумаешься? |
20.07.2010, 19:17 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
Если бы не ощущал разницу, не задавал бы вопроса, и реализовал бы все и с использованием ХТ=) Тему можно закрыть, т.к. ответ на интересующий вопрос получен. |
20.07.2010, 19:19 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
да не намного медленней, хотя с версией 1.24 всё стало гораздо медленней из-за hashtable. там у тодди помимо обращения к ячейке, ещё вызов этих убогих функций хештейбла + 5-10 проверок нужного айди массива
ScorpioT1002 добавил: ну кароче в цикле лучше его не юзать) |
21.07.2010, 07:33 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexeiK
offline
Опыт:
257Активность: |
если хендл содержит например 8 цифр ,то
сделай два массива и разрежь число пополам. значение как собрать думаю ясно, и поиск тоже ясен. конечно при трех массивах утебя максимум будет 819 281 928 192 :) Отредактировано Enein, 26.08.2010 в 21:17. |
26.08.2010, 18:58 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
не надо ничего резать, надо просто вычесть число, с которого начинается отсчёт |
27.08.2010, 16:00 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Faion, в этой теме я поднимал такойже вопрос. Там есть и ответ.
|
27.08.2010, 16:08 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JassMan
свободен
offline
Опыт:
4,193Активность: |
У меня хеш таблица всему голова, и не такая уж она медленная. Да глобалки быстрее с массивами но не значительно. |
27.08.2010, 17:46 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Цитата:
Нужно именно вычитать! AlexeiK, без обид, но твой способ - лишний гемморой. Использовать хендл объекта в качестве индекса массивов - просто обалденная вещь, уже проверено. п.с. правда пришлось много чего переписать. |
|
30.08.2010, 21:45 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт:
6,885Активность: |
Офигеть просто)) А зачем использовать хендл юнита как индекс массива, если хендл юнита можно использовать как индекс хеш-таблицы.. в ней происходит все тоже самое: ваше число поиском (не тупым перебором, а быстрым) ищется в таблице, и вытаскивается результат.. хеш-таблицы и придуманы чтобы быстро вести поиск, причем это вшито в движок.. а вы тоже самое интерпретатором хотите получить, зачем? |
30.08.2010, 22:49 | #15
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
это работало когда был рб, а сейчас нельзя получить номер хендла независимо от версии, так что расслабьтесь |
31.08.2010, 00:13 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexeiK
offline
Опыт:
257Активность: |
Alex_Hell, тут ошибка у тебя для хэщ таблиц.
у них ключ, в данном случае твой хендл, хэшируется по какому то алгоритму,чтобы получить уникальный идентификатор.
быстрота хэш массива зависит, как раз от алгоритма который хэширует ключ. думаю даже хэш ключа нигде не хранится, а просчитывается при каждом обращении к массиву. на цифрах может и быстро хэштаблица пашет, а ты попробуй текстовые ключи или другого содержания. то есть ты ввел ключ типа "12323232" , алгоритм хэша , хэширует его ,получает хэш,
что есть индекс, делает смещение и выдает результат. в массивах,ты ввел индекс и без вычислений хэша получил результат, так как индекс это смещение от указателя массива.
и соотвественно, даже мой способ, он реально геморный, пока нету обертки на jass , будет быстрее чем хэш таблица, особенно на слабых компах,это будет чувствоваться.
теперь представь, какой код может хэшировать эти 10 байт из которых состоит хэндл? их надо разобрать, произвести математические операции и только тогда, получить индекс массива и уже обратиться за значением. Отредактировано AlexeiK, 31.08.2010 в 11:07. |
31.08.2010, 10:45 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
там нехитрые побитовые операции, которые выполняются за один процессорный такт |
31.08.2010, 11:20 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexeiK
offline
Опыт:
257Активность: |
ScorpioT1000, да ты не так делай. ты код ассемблерный покажи этой фукнции ,чтобы сразу стало все ясно. |
31.08.2010, 12:10 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
имхо структуры рулят =)
Код:
|
31.08.2010, 17:17 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|