Объясните, пожалуйста, как правильно сохранять структуру в хэш-таблицу, выгружать оттуда, уничтожать её и всё очищать?
Я попробовал что-то похожее сделать, но я правда без понятия как оно работает
Просто читаю всё что нахожу и пытаюсь как-то сам фигнёй пострадать
код
globals
hashtable H = InitHashtable()
endglobals

struct cord
 real x
 real y
 real z
endstruct

function MyFunc1 takes nothing returns nothing
    local cord A = LoadInteger(H,0,0)
    call BJDebugMsg(R2S(A.x)+" "+R2S(A.y)+" "+R2S(A.z))
    call FlushChildHashtable(H,0)
    call cord.destroy(A)
endfunction

function MyFunc takes nothing returns nothing
 local cord A=cord.create()

 set A.x=5
 set A.y=8
 set A.z=A.y+A.x
 call SaveInteger(H,0,0,A)
 call MyFunc1()
 call BJDebugMsg(R2S(A.x)+" "+R2S(A.y)+" "+R2S(A.z))

endfunction

Принятый ответ

В целом не нужно, я думаю, если ты все поля при создании структуры инициализируешь (я не уверен обнуляет ли их аллокатор)
Структура просто integer потому что в коде в итоге генерирутся параллельные массивы т.е. например
real array cord_x
real array cord_y
real array cord_z
unit array cord_u
Для каждого члена структуры. Поэтом сама cord это просто индекс в эти массивы. Когда ты делаешь cord.create() находится свободный индекс в этих "параллельных" массивах и помечается заполненным.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
3 года назад
0
Похожие вопросы:

ответ
ладно. заработало.
не рабочий вариант
call SaveInteger(Hash,GetHandleId(GetTriggerUnit()),5555, CurrentNumberOfSettlement) в одном триггере сохраняем
set CurrentNumberOfSettlement = LoadInteger(Hash,GetHandleId(GetTriggerUnit()),5555) в другом триггере для проверки выгружаем
рабочий вариант
local integer id = GetHandleId(GetTriggerUnit())
call SaveInteger(Hash,id,5555, CurrentNumberOfSettlement) в одном триггере сохраняем
set CurrentNumberOfSettlement = LoadInteger(Hash,id,5555) в другом триггере для проверки выгружаем
Короче вернул обратно локалки, и все заработало. И почему первый вариант не работал. Ладно будут искать подводные камни. Наверное после чистой оптимизации что-то перестало работать. эх... придеться посравнивать. похоже старый код где то мб лучше. только времени потратил на методы тыка.

1
29
3 года назад
1
Так а что не работает конкретно? На вид корректно все
Структура действительно просто integer
0
27
3 года назад
0
Doc, а если я, допустим, сохраню в структуру ссылку на юнита её нужно обнулять?

код
struct cord
 real x
 real y
 real z
 unit u
endstruct

function MyFunc1 takes nothing returns nothing
    local cord A = LoadInteger(H,0,0)
    call BJDebugMsg(R2S(A.x)+" "+R2S(A.y)+" "+R2S(A.z))
    call FlushChildHashtable(H,0)
    set A.u=null
    call cord.destroy(A)
endfunction

function MyFunc takes nothing returns nothing
 local cord A=cord.create()

 set A.x=5
 set A.y=8
 set A.z=A.y+A.x
 set A.u=GetTriggerUnit()
 call SaveInteger(H,0,0,A)
 call MyFunc1()
 call BJDebugMsg(R2S(A.x)+" "+R2S(A.y)+" "+R2S(A.z))

endfunction
1
29
3 года назад
1
В целом не нужно, я думаю, если ты все поля при создании структуры инициализируешь (я не уверен обнуляет ли их аллокатор)
Структура просто integer потому что в коде в итоге генерирутся параллельные массивы т.е. например
real array cord_x
real array cord_y
real array cord_z
unit array cord_u
Для каждого члена структуры. Поэтом сама cord это просто индекс в эти массивы. Когда ты делаешь cord.create() находится свободный индекс в этих "параллельных" массивах и помечается заполненным.
Принятый ответ
2
27
3 года назад
2
Doc, хах, спасибо)
0
17
3 года назад
0
а если я, допустим, сохраню в структуру ссылку на юнита её нужно обнулять?
Да
1
29
3 года назад
Отредактирован PT153
1
Vlod:
Да
Пояснил бы причину тогда уже, в чем смысл обнулять, если потом этот слот переиспользуется?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.