Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Алгоритм
Версия Warcraft:
1.26a+
Как известно, функцию InitHashtable() можно вызывать ограниченное количество раз. Поэтому для динамического выделения нативных хеш-таблиц нужен буфер, с помощью которого можно было бы переиспользовать уже созданные хеш-таблицы. Данная библиотека предоставляет 2 метода:
local hashtable ht = HT_create() // для получения hashtable из буфера
call HT_destroy(ht) // для отправки hashtable в буфер
Повторный вызов HT_destroy() ничего не сломает. Если использовать методы одной библиотеки внутри другой, то ее следует указать в зависимостях.
library HT
    globals
        private hashtable array ht
        private boolean array allocated
        private integer max = -1
    endglobals
    
    public function create takes nothing returns hashtable
        local integer i = 0
        loop
        exitwhen i > max
            if not allocated[i] then
                set allocated[i] = true
                return ht[i]
            endif
        set i = i+1
        endloop
        set max = max+1
        set ht[max] = InitHashtable()
        set allocated[max] = true
        return ht[max]
    endfunction
    
    public function destroy takes hashtable h returns nothing
    local integer i = 0
    if h != null then
        loop
        exitwhen i > max
            if ht[i] == h then
                set allocated[i] = false
                return
            endif
        set i = i+1
        endloop
    endif
    endfunction
    
endlibrary
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
3 года назад
0
Интересно для чего может понадобиться динамически создавать хэш-таблицы?
0
28
3 года назад
0
KaneThaumaturge, для чего в принципе может понадобится 2 хештаблицы.
0
32
3 года назад
0
Хм, ну очень сомнительно, ну 1, ну 2, ну 10, но 256+ то нах?
PT153, Они так разграничивают данные, StringhHash не научились юзать.
0
17
3 года назад
Отредактирован GetLocalPlayer
0
PT153:
KaneThaumaturge, для чего в принципе может понадобится 2 хештаблицы.
Реализовать хэш-мап (+1 таблица).
Реализовать список на хэш-таблице (+1 таблица)
Использовать в качестве ключа что-то кроме хэндл ид (хэш строки, например) избегая коллизий (+1 таблица).
У тебя может быть способность, которая должна сохранять данные на касетра + цель. При этом целей может быть несколько. Следовательно, в key идет ид кастера, в value ид всех целей. Если таких способностей несколько, +1 таблица на каждую.
0
17
3 года назад
0
Обновление
Убрана строка, которая автоочищает таблицу. После вызова функции FlushParentHashtable() невозможно повторно сохранять значения.
call FlushParentHashtable(h)
0
19
3 года назад
Отредактирован KaneThaumaturge
0
У тебя может быть способность, которая должна сохранять данные на касетра + цель. При этом целей может быть несколько. Следовательно, в key идет ид кастера, в value ид всех целей. Если таких способностей несколько, +1 таблица на каждую.
Создать группу целей и привязать ее к кастеру.

Не знаю, может я чего-то не понимаю.
0
17
3 года назад
Отредактирован GetLocalPlayer
0
Создать группу целей и привязать ее к кастеру.
Ну так тебе нужно хранить данные не по кастер + группа целей, а кастер + цель. Для каждой цели каждого кастера свой индивидуальный набор данных.
0
19
3 года назад
0
GetLocalPlayer, Что тут сложного? Зачем более 1 хэштаблицы? На структурах все сохраняется, хотя можно и без них.

GetLocalPlayer, А можно пример способности?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.