|
|
|
|
Хэш-таблицы
|
|
DarkVader | Дата: Понедельник, 25 Октября 2010, 07:04:28 | Сообщение # 1 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Хочу спросить кое чего по хэш-таблицам и в частности поводу функции GetHandleId( handle )... 1) Какое максимальное значение child и parent ключей в хэш-таблицах? 2) целочисленная возвращенная функцией GetHandleId() является уникальной для каждого хэндла? или они могут повторяться? и каким образом присваевается id хэндлу?
|
|
|
|
Fannad | Дата: Понедельник, 25 Октября 2010, 08:36:52 | Сообщение # 2 |
1 уровень
Группа: Пользователи
Сообщений: 2
Награды: 0
Репутация: 0
Блокировки:
| DarkVader, 1) Я могу тебе только точно сказать, что 2147483647 - максимальное значение типа integer. Значит, это и максимальное значение, учитывая, что вар написан на программном языке С. 2) Номер уникален для каждого хендла. Нумерация хендлов начинается от 100000.
|
|
|
|
DarkVader | Дата: Понедельник, 25 Октября 2010, 15:28:56 | Сообщение # 3 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Спасибо большое=))) И последнее уточнение, то есть если разные хэндлы буду создаваться в течении игры и они буду указывать на одного и того же юнита, то их id не повторится?
|
|
|
|
[san9] | Дата: Понедельник, 25 Октября 2010, 16:16:43 | Сообщение # 4 |
10 уровень
Группа: Проверенные
Сообщений: 1500
Награды: 1
Репутация: 286
Блокировки:
| Quote (DarkVader) Спасибо большое=))) И последнее уточнение, то есть если разные хэндлы буду создаваться в течении игры и они буду указывать на одного и того же юнита, то их id не повторится? Конечно нет, ячейки ведь разные
|
|
|
|
DarkVader | Дата: Понедельник, 25 Октября 2010, 16:59:37 | Сообщение # 5 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Quote (|san9|) Конечно нет, ячейки ведь разные я что то окончательно запутался=))) юзал юзал хэш и тут мне в голову ударило=))) а если хэндл локальный как его ид передается между функциями? например взять тот же твой код Code //TESH.scrollpos=-1 //TESH.alwaysfold=0 function Trig_Dmg_RmvTrg takes nothing returns nothing local timer Tmr = GetExpiredTimer() local trigger Trg = LoadTriggerHandle(udg_Hash, GetHandleId(Tmr), 1) call FlushChildHashtable(udg_Hash, GetHandleId(Tmr)) call DestroyTimer(Tmr) set Tmr = null call DestroyTrigger(Trg) set Trg = null endfunction
function Trig_Dmg_TakeDmg takes nothing returns nothing local trigger Trg = GetTriggeringTrigger() set udg_Dmg[1] = GetEventDamage() set udg_DmgUnit[1] = GetEventDamageSource() if (udg_Dmg[1] > udg_Dmg[2]) then set udg_Dmg[2] = udg_Dmg[1] set udg_DmgUnit[2] = udg_DmgUnit[1] endif // EndTestComands call DestroyTrigger(Trg) set Trg = null endfunction
function Trig_Dmg_TakeAttack takes nothing returns nothing local trigger Trg = CreateTrigger() local timer Tmr = CreateTimer() call TriggerRegisterUnitEvent(Trg, GetTriggerUnit(), EVENT_UNIT_DAMAGED) call TriggerAddAction(Trg, function Trig_Dmg_TakeDmg) call SaveTriggerHandle(udg_Hash, GetHandleId(Tmr), 1, Trg) call TimerStart(Tmr, 7, false, function Trig_Dmg_RmvTrg) set Trg = null set Tmr = null endfunction
//=========================================================================== function InitTrig_Dmg takes nothing returns nothing set gg_trg_Dmg = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Dmg, EVENT_PLAYER_UNIT_ATTACKED ) call TriggerAddAction( gg_trg_Dmg, function Trig_Dmg_TakeAttack ) endfunction local timer Tmr = GetExpiredTimer() local trigger Trg = LoadTriggerHandle(udg_Hash, GetHandleId(Tmr), 1) //======== local timer Tmr = CreateTimer() call SaveTriggerHandle(udg_Hash, GetHandleId(Tmr), 1, Trg) они же по идее разные но указывают на один оъект, у них разве ид одинаковые будут?
|
|
|
|
Ralex | Дата: Понедельник, 25 Октября 2010, 18:23:01 | Сообщение # 6 |
6 уровень
Группа: Проверенные
Сообщений: 213
Награды: 0
Репутация: 6
Блокировки:
| Короче handle - номер ячейки объекта, при удалении объекта во время игры, то его ячейка освобождается => следующий объект займёт эту ячейку Вот где я прочитал это и вам советую http://xgm.ru/page/634
1 - я практически всё пишу по памяти 2 - если я не ответил - пишите ПМ
|
|
|
|
DarkVader | Дата: Понедельник, 25 Октября 2010, 22:40:25 | Сообщение # 7 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Quote (Ralex) Короче handle - номер ячейки объекта, при удалении объекта во время игры, то его ячейка освобождается => следующий объект займёт эту ячейку Вот где я прочитал это и вам советую http://xgm.ru/page/634 Хэндл это не номер ячейки, нет ну конечно можно его так назвать в обощенном виде=))) Спасибо за статью, поглядел почитал, но к сожелению не нашел того что искал, ведь статья довольно старая и там нету ни слова о хэш таблицах=( Добавлено (25-10-2010, 22:40) --------------------------------------------- Точнее меня интересует каким образом сохранение и загрузка данных через ид разных хэндлов в итоге получается корректный переброс данных через хэш таблицу? Просто я например не пользуюсь ид хэндлов а на прямую записываю ключи ячеек таблицы, но такой способ не является универсальным, и триг может дать сбой если использовать триг еще раз до его завершения...
|
|
|
|
DragoN | Дата: Вторник, 26 Октября 2010, 18:18:02 | Сообщение # 8 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Quote (Fannad) 2) Номер уникален для каждого хендла. Нумерация хендлов начинается от 100000. с 0x100000 вообще-то )
El Psy Congroo
|
|
|
|
DarkVader | Дата: Вторник, 26 Октября 2010, 21:23:57 | Сообщение # 9 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Dragon93, может ты скажешь каким образом работает прицип указания строки через ид хэндла?
|
|
|
|
DragoN | Дата: Вторник, 26 Октября 2010, 23:33:15 | Сообщение # 10 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Quote (DarkVader) Точнее меня интересует каким образом сохранение и загрузка данных через ид разных хэндлов в итоге получается корректный переброс данных через хэш таблицу? у хэш таблицы структура работы имеет большую схожесть с кэшем по сути это двумерный массив, только в отличие от кэша запись идёт по числу, а не строке Quote (Ralex) Короче handle - номер ячейки объекта, при удалении объекта во время игры, то его ячейка освобождается => следующий объект займёт эту ячейку ну вообще-то это ссылка на объект
El Psy Congroo
|
|
|
|
DarkVader | Дата: Среда, 27 Октября 2010, 01:12:02 | Сообщение # 11 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Эм, ну хорошо, а вот такая запись будет корректной? Ну эт просто пример=) Будет ли нормально загружена реальная? проверка выдает неопределенную переменную u в верхней функции, так каким образом можно будет потом извлеч реальную сохраненную в строку с номером ид хэндла u? Code function Trig_NewTrigger_Actions2 takes nothing returns nothing local real r = LoadReal( udg_HASH, GetHandleId(u), 1) endfunction
function Trig_NewTrigger_Actions takes nothing returns nothing local unit u = GetTriggerUnit() local timer t = CreateTimer() local real r = 50 call SaveReal( udg_HASH, GetHandleId(u), 1, r) call TimerStart( t, 1, true, function Trig_NewTrigger_Actions2) endfunction
function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerAddAction(gg_trg_NewTrigger, function Trig_NewTrigger_Actions) endfunction Добавлено (27-10-2010, 01:12) --------------------------------------------- наверно я прост туплю, просто скажите плиз как привильно сэйвить используя GetHendleId( ) для указания строки...
|
|
|
|
Pa3apT | Дата: Среда, 27 Октября 2010, 11:48:41 | Сообщение # 12 |
8 уровень
Группа: Проверенные
Сообщений: 653
Награды: 0
Репутация: 166
Блокировки:
| DarkVader, если ты передаш юнита u из ф-ции Trig_NewTrigger_Actions в й-цию Trig_NewTrigger_Actions2, то да И вообще почему вы прикрепляете к чему-то. Это просто один из вариантов, для муи спелов например. А твой код должен выглядеть примерно так Code function Trig_NewTrigger_Actions2 takes nothing returns nothing local timer t = GetExpiredTimer() local unit u = LoadUnitHendle( udg_HASH, GetHandleId(t), StringHash("unit")) local real r = LoadReal( udg_HASH, GetHandleId(u), StringHash("real")) endfunction
function Trig_NewTrigger_Actions takes nothing returns nothing local unit u = GetTriggerUnit() local timer t = CreateTimer() local real r = 50 call SaveReal( udg_HASH, GetHandleId(u), StringHash("real"), r) call SaveUnitHendle( udg_HASH, GetHandleId(t), StringHash("unit"), u) call TimerStart( t, 1, true, function Trig_NewTrigger_Actions2) endfunction
function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerAddAction(gg_trg_NewTrigger, function Trig_NewTrigger_Actions) endfunction Вот тут и в 1, и во 2 ф-ции переменные t и u равны
Сообщение отредактировал Pa3apT - Среда, 27 Октября 2010, 11:53:48 |
|
|
|
DarkVader | Дата: Среда, 27 Октября 2010, 13:01:56 | Сообщение # 13 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Pa3apT, спасибо, не до конца конечно разобрался, на практике поэксперементирую=)
|
|
|
|
DragoN | Дата: Среда, 27 Октября 2010, 14:15:51 | Сообщение # 14 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| DarkVader, вешать надо на хэндл таймера, а не на хэндл юнита таймер можно будет словить через GetExpiredTimer() в нужной функции и вытащить из него что надо
El Psy Congroo
|
|
|
|
DarkVader | Дата: Среда, 27 Октября 2010, 14:31:06 | Сообщение # 15 |
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
| Dragon93, окей, спасибо=)
|
|
|
|
|
|
|
|
|
|
|