Сейчас 02:47:41 Суббота, 20 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Хэш-таблицы
Хэш-таблицы
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, окей, спасибо=)
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Хэш-таблицы
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz