Объясните, пожалуйста, как правильно сохранять структуру в хэш-таблицу, выгружать оттуда, уничтожать её и всё очищать?
Я попробовал что-то похожее сделать, но я правда без понятия как оно работает
Просто читаю всё что нахожу и пытаюсь как-то сам фигнёй пострадать
код
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:
Да
Пояснил бы причину тогда уже, в чем смысл обнулять, если потом этот слот переиспользуется?
1
27
3 года назад
1
ребят, спасибо)
я уже понял как это работает
2
28
3 года назад
2
Doc, чтобы хендл скорее освободился и был занят новым объектом.

Но это такое, хотите обнуляйте, хотите нет, ничего принципиально не изменится.
1
28
3 года назад
1
rsfghd, может вот тут посмотреть вплоть до линии 210, как я привязывал таймеры к структурам через хеш. Вот тут пример использования.
0
17
3 года назад
Отредактирован Vlod
0
Doc:
Пояснил бы причину тогда уже, в чем смысл обнулять, если потом этот слот переиспользуется?
Хорошо. В общем случае нам не известно будет ли переиспользоваться тот или иной блок и сколько таких блоков будет переиспользоваться. Будут ли структуры использоваться единожды, будут ли использоваться сначала много, а потом мало блоков или будут держаться примерно на одном уровне. Поэтому, чтобы не заниматься эвристикой, мы просто освобождаем данные и прекращаем учитывать, как будет использоваться каждая структура, прекращаем заниматься микрооптимизацией без необходимости
1
28
3 года назад
1
прекращаем заниматься микрооптимизацией без необходимости
Но ведь обнуление в это случае и есть микрооптимизация...
0
17
3 года назад
0
Не-обнуление можно сравнить с умышленной утечкой памяти, потому что слот может переиспользуется, а может и нет. Каждый раз совершая такие допущения следует учитывать специфику работы со структурой. Лично мне не удобно думать об этом когда решаешь задачи другого характера. Во вторых автор спросил без конкретных уточнений, поэтому я ответил в общем случае
Чтобы оставить комментарий, пожалуйста, войдите на сайт.