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

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

Закрытая тема
 
Toadcop

offline
Опыт: 54,313
Активность:
хммм... еще не то что надо. продолжайте дальше ! ;)
Старый 25.05.2007, 22:27
Toadcop

offline
Опыт: 54,313
Активность:
прошло некоторе время и не кто не нашол норм решение...
ок я выставлю своё !

вот сам код // нужен vJass compiler что сохранить такую карту

Код:
globals
    integer eax=0
// stack
    integer stack_max=0
    integer array stack_free
    boolean array stack_used
    integer stack_free_max=0
// replace stack
    integer repstack_max=0
    integer array repstack
    boolean array repstack_used
    integer array repstack_pos
// Data arrays
    unit array units
// test
    unit eux=null
endglobals


function echo takes string s returns nothing
        call DisplayTextToPlayer(GetLocalPlayer(),0,0,s)
endfunction

function echoAdv takes string s returns nothing
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,99999999,s)
endfunction

function AddEffectTarget takes string s,widget w,string a returns nothing
    call DestroyEffect(AddSpecialEffectTarget(s,w,a))
endfunction


//#####
// Stack
function StackGetSlot takes nothing returns integer
  if stack_free_max>0 then
    set eax=stack_free[stack_free_max]
    set stack_used[eax]=true
    set stack_free_max=stack_free_max-1
    return eax
  else
    set stack_max=stack_max+1
  if stack_max>8190 then
    set stack_max=8190
    return 0
  else
    set stack_used[stack_max]=true
    return stack_max
  endif
  endif  
    return 0
endfunction

function StackFreeSlot takes integer i returns nothing
  if stack_used[i] then
    set stack_free_max=stack_free_max+1
    set stack_used[i]=false
    set stack_free[stack_free_max]=i
  endif
endfunction

//#####
// Replace Stack

function Repstack_Add takes integer i returns nothing
   if repstack_used[i]==false then
      set repstack_max=repstack_max+1
      set repstack_used[i]=true
      set repstack_pos[i]=repstack_max
      set repstack[repstack_max]=i
   endif
endfunction

function Repstack_Remove takes integer i returns nothing
   if repstack_used[i] then
      set repstack_used[i]=false
      set repstack[repstack_pos[i]]=repstack[repstack_max]
      set repstack_pos[repstack[repstack_max]]=repstack_pos[i]
      set repstack_max=repstack_max-1      
   endif
endfunction

//#####
// My Alg

function AddUnitX takes unit u returns integer
      local integer i=StackGetSlot()
      call Repstack_Add(i)
      set units[i]=u
      return i
endfunction

function RemoveUnitX takes integer i returns nothing
      call StackFreeSlot(i)
      call Repstack_Remove(i)
      set units[i]=null
endfunction


как видно всё просто ! но как видно не совсем ;) (ну по вашим сообщения)
имхо это мой способ я не исключаю что есть и лутче способ !

в карте дополнительный код для тестирования !
карта прилагаетса ! // тестируйте в игре !
Прикрепленные файлы
Тип файла: w3x X.w3x (13.7 Кбайт, 19 просмотров )
Старый 29.05.2007, 23:06
J
expert
offline
Опыт: 48,447
Активность:
мдя..... знаеш... это, _может быть_ и оптимально, но на каждый такой случай, по столько глобалок, то это будет очень неоптимально, ибо это будет опсалютно бесмыслено...
Старый 29.05.2007, 23:11
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Jon, Toadcop вписывает глобалки в коммон.ж (или в близзард, хз не помню)) и удаляет лишние из близзард, в результате часть неиспользуемых переменных меняется на юзаемые, а постоянное время доступа к глобалкам окупает себя, тк локальные переменные при таком раскладе почти не нужно создавать
Старый 30.05.2007, 03:20
Toadcop

offline
Опыт: 54,313
Активность:
FellGuard не обращай внимания на глупые сообщения ! (да кстати я тестил количество переменных обсолютно не влияет на скорость обращения к ним и т.д. ! т.е. можно имееть 10К + переменных и это кроме размера кода ничего не изменит ! + обфускация Близз.дж и даже коммон не нужна !) а ты теперь понял простоту данного примера ?! вот почему я и говорил что у тебя самый лутчый из представленых вариантов ;) хоть и были глюки т.к. я смотрю на потенциал алгоритма а не иммено на его текущию работаспособность (т.е. ход мышление создателя)

да ксатати объясню принцип:
мы выделяем аддрес (как напр в варе хендлы так же выделяютьса)
и потом этот этот адресс помешаем с плотную структыру которая содержить все существующие елементы подрят. и т.к. главный индекс (который был нам выдан) являетьса "констатным" т.е. их можно перемещать как угодно (что и делаетьса в плотной структуре кстати я называю это "заменяемый стек" "replace stack" т.к. на места освободившихся слотов переноситьса последний... и уменьшается общий размер структуры) вот так !
имхо не очень сложно надо только допереть а вот допереть и являетьса самым важным + сложным !
Старый 30.05.2007, 12:12
Закрытая тема

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

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

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

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



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