Сейчас 11:24:49 Четверг, 28 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
_allocate и _deallocate в структурах
ВолчачкаДата: Вторник, 17 Марта 2015, 19:37:13 | Сообщение # 1
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Код который генерирует vJass
Код

//Generated allocator of Ex
function s__Ex__allocate takes nothing returns integer
  local integer this=si__Ex_F
     if (this!=0) then
         set si__Ex_F=si__Ex_V[this]
     else
         set si__Ex_I=si__Ex_I+1
         set this=si__Ex_I
     endif
     if (this>8190) then
         call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Unable to allocate id for an object of type: Ex")
         return 0
     endif

    // установка знчений >>>>|
  return this
endfunction

//Generated destructor of Ex
function s__Ex_deallocate takes integer this returns nothing
     if this==null then
             call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Attempt to destroy a null struct of type: Ex")
         return
     elseif (si__Ex_V[this]!=-1) then
             call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Double free of type: Ex")
         return
     endif
     set si__Ex_V[this]=si__Ex_F
     set si__Ex_F=this
endfunction


Моя версия
Код

function _allocate takes nothing returns integer
  local this = 0
     if (si_<stuct name>_N > 0) then
         set this = si_<stuct name>_S[si_<stuct name>_N]
   set si_<stuct name>_N = si_<stuct name>_N - 1
     else
   if (this>8190) then
    call BJDebugMsg("Unable to allocate id for an object of type: Ex")
    return -2 //-2 is full
   else
    set si_<stuct name>_I=si_<stuct name>_I+1
    set this=si_<stuct name>_N_I
   endif
     endif
   // установка знчений >>>>|
  return this
endfunction

function _deallocate takes integer this returns nothing
      
  if this == -1 then //-1 is empty
   call BJDebugMsg("Attempt to destroy a null struct of type: Ex")
  else
   set si_<stuct name>_N = si_<stuct name>_N + 1
   set this = si_<stuct name>_S[si_<stuct name>_N] = this
  endif
   
   
endfunction
 

DuosoraДата: Вторник, 17 Марта 2015, 19:39:05 | Сообщение # 2
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
Волчачка,
И как же ты планируешь это вшить? Lua?


Не зли других и сам не злись.
Мы - гости в этом мире.
И если что не так - смирись,
Будь поумнее - улыбнись,
Ведь в мире всё закономерно.
Зло, излучённое тобой,
К тебе вернётся непременно.
 

ВолчачкаДата: Вторник, 17 Марта 2015, 19:55:22 | Сообщение # 3
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Цитата Duosora ()
Волчачка,
И как же ты планируешь это вшить? Lua?

хз
а сир николас наверно предложил бы сделать всё в одном массиве
8190 на ряда
0..4094 - максимум записей струкутр
4095..8190 - максимум на резерв делоцированных =D

Добавлено (17 Марта 2015, 19:55:22)
---------------------------------------------

Код
if this == -1 then //-1 is empty


fixed:
Код
if this == -1 and si_<stuct name>_N !=0 then //-1 is empty
 

SirNikolasДата: Вторник, 17 Марта 2015, 22:29:34 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Волчачка, можно увидеть рабочий вариант? Просто подозреваю, что где-то тут есть пара опечаток.

Строка "set this = si_<stuct name>_S[si_<stuct name>_N] = this" особенно радует.


 

ВолчачкаДата: Вторник, 17 Марта 2015, 22:38:50 | Сообщение # 5
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Цитата SirNikolas ()
Волчачка, можно увидеть рабочий вариант? Просто подозреваю, что где-то тут есть пара опечаток.

Код

function s_<stuct name>_allocate takes nothing returns integer
     local this = 0
        if (si_<stuct name>_N > 0) then
            set this = si_<stuct name>_S[si_<stuct name>_N]
      set si_<stuct name>_N = si_<stuct name>_N - 1
        else
      if (this>8190) then
       call BJDebugMsg("Unable to allocate id for an object of type: <stuct name>")
       return -2 //-2 is full
      else
       set si_<stuct name>_I=si_<stuct name>_I+1
       set this=si_<stuct name>_N_I
      endif
        endif
     return this
endfunction

function s_<stuct name>_deallocate takes integer this returns nothing
            
     if this == -1 and si_<stuct name>_N != 0 then //-1 is empty
      call BJDebugMsg("Attempt to destroy a null struct of type:<stuct name>")
     else
      set si_<stuct name>_N = si_<stuct name>_N + 1
      set  si_<stuct name>_S[si_<stuct name>_N] = this
     endif
         
         
endfunction

:D


Сообщение отредактировал Волчачка - Вторник, 17 Марта 2015, 22:53:28
 

SirNikolasДата: Среда, 18 Марта 2015, 10:47:18 | Сообщение # 6
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Ясно. Освобожденные объекты заносятся в стек. При создании нового пытаемся взять из стека, если он не пуст, в противном случае увеличиваем max capacity и берем новый.

Такой подход чуть-чуть оптимальнее варианта со связным списком от Vexorian, но он обладает существенным недостатком: если освободить один объект два раза, мало того, что не будет никакого оповещения, так потом еще и весь механизм выделения памяти сломается.
Код
MyStruct s = MyStruct.create();
//Возможно, удаление вызывается где-нибудь в разных местах.
//По ошибке мы не заметили и удалили два раза.
s.destroy();
s.destroy();
//Кажется, пока все нормально.
s = MyStruct.create();
//Но только до тех пор, пока мы не решим создать еще один объект.
MyStruct s2 = MyStruct.create();
if s == s2 { BJDebugMsg("WTF?!"); }


 

ВолчачкаДата: Четверг, 23 Апреля 2015, 23:11:27 | Сообщение # 7
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:


Добавлено (23 Апреля 2015, 23:11:27)
---------------------------------------------
[code=jass]// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ??           KING JASS STRUCTURES              ??
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function kj_StuctNew takes nothing returns integer
local integer StructIndex = 0
if kj_Struct_FSI >= 0 then
set StructIndex = kj_Struct_S[kj_Struct_FSI]
set kj_Struct_F[StructIndex] = true
set kj_Struct_S[kj_Struct_FSI] = 0
set kj_Struct_FSI = kj_Struct_FSI - 1
return StructIndex
endif
if kj_Struct_I >= 8190 then
call BJDebugMsg("I can't create new structure.")
return -1
else
set kj_Struct_I = kj_Struct_I + 1
set StructIndex = kj_Struct_I
endif
return StructIndex
endfunction

function kj_StuctFree takes integer StructIndex returns nothing
if StructIndex > -1 and kj_Struct_F[StructIndex] and kj_Struct_I > -1 then
set kj_Struct_FSI = kj_Struct_FSI + 1
set kj_Struct_F[StructIndex] = false
set kj_Struct_S[kj_Struct_FSI] = StructIndex
else
call BJDebugMsg("I can't release this structure.")
endif
endfunction

function kj_InitStructs takes nothing returns nothing
set kj_I = 0
loop
exitwhen kj_I == 8191
set kj_Struct_F[kj_I] = true
set kj_I = kj_I + 1
endloop
set kj_I = 0
endfunction[/code]
Йа победиль Вексориана!


Сообщение отредактировал Волчачка - Пятница, 24 Апреля 2015, 13:06:21
 

DuosoraДата: Четверг, 23 Апреля 2015, 23:33:45 | Сообщение # 8
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
Волчачка,
Такая реализация мне по душе. ) Хорошая работа!


Не зли других и сам не злись.
Мы - гости в этом мире.
И если что не так - смирись,
Будь поумнее - улыбнись,
Ведь в мире всё закономерно.
Зло, излучённое тобой,
К тебе вернётся непременно.
 

  • Страница 1 из 1
  • 1
Поиск:

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