SirNikolas, верно. Но можне внести условие на то,
Код
this == -1 and si_<stuct name>_N != 0 and si_<stuct name>_S[si_<stuct name>_N] != this
Добавлено (19 Марта 2015, 13:22:41)
---------------------------------------------
Также можно разделить всё на один массив
Цитата
0..4094 - максимум записей струкутр
4095..8190 - максимум на резерв делоцированных =D
Так мы облегчим память все равно в варике больно много не надо.
=> Достаточно двух шагов и одного массива
А ещё после извлечения из стека свободного массива
мы почищаем стэк
Код
set this = si_<stuct name>_S[si_<stuct name>_N]
New v
Код
set this = si_<stuct name>_S[si_<stuct name>_N]
set si_<stuct name>_S[si_<stuct name>_N] = 0 // а значит обнуляем -> освобождаем память
Добавлено (19 Марта 2015, 16:00:34)
---------------------------------------------
А вообще я могу разделить 1 массив на 3-ое
N[
0...1999 Получаем значения
2000..3999 Сохраняемые значение
4000..6000 Было ли уже удалено это значение 0 - да 1 - нет
]
Добавлено (19 Марта 2015, 18:47:36)
---------------------------------------------
Хотя ограничусь двумя
:D Код
function s_allocate takes nothing returns integer
local this = 0
if si_N > -1 then
set this = si_S[si_N]
set si_S[si_S[si_N]+4095] = 0
set si_S[si_N] = 0
set si_N = si_N - 1
else
if si_I == 4094 then
call BJDebugMsg("Unable to allocate id for an object of type: <stuct name>")
return -1 //-1 is full
else
set si_I=si_I+1
set this=si_I
endif
endif
return this
endfunction
function s_deallocate takes integer this returns nothing
if this == -1 and si_N != -1 and si_S[this+4095] == 0 then //-1 is empty
call BJDebugMsg("Attempt to destroy a null struct of type:<stuct name>")
else
set si_N = si_N + 1
set si_S[si_N] = this
set si_S[si_S[si_N]+4095] = 1
endif
endfunction
Добавлено (02 Апреля 2015, 20:44:40)
---------------------------------------------
Код
function s_deallocate takes integer this returns nothing
if this == -1 or si_N == -1 or si_S[this+4095] == 0 then //-1 is empty
call BJDebugMsg("Attempt to destroy a null struct of type:<stuct name>")
else
set si_N = si_N + 1
set si_S[si_N] = this
set si_S[si_S[si_N]+4095] = 1
endif
endfunction