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

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

Ответ
 
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Перевод 1.24+
В общем хотел одну старую мапку перевести на новый патч, смотрел эту тему, но как применить конкретно у этому случаю, я не знаю, жду помощи.
» Весь Код
function LL_ly takes location l returns location
    return GetLocationY(l)
    return null
endfunction

function LL_r2i takes real r returns integer
    return r
    return 0
endfunction

function LL_i2r takes integer i returns real
    return i
    return 0.
endfunction

function LL_h2r takes handle h returns real
    return h
    return 0.
endfunction

function LL_GetLocationY_Loc takes location loc returns location
    set bj_enumDestructableCenter = LL_ly(loc)
    return bj_enumDestructableCenter
endfunction

function LL_NewList takes integer value returns location
    return Location(LL_i2r(value), 0.)
endfunction


function LL_GetListSize takes location list returns integer
    local integer i = 1

    loop
        exitwhen LL_GetLocationY_Loc(list) == null
        set list = LL_GetLocationY_Loc(list)
        set i = i + 1
    endloop
    return i
endfunction

function LL_AddListItemInBackOf takes location list, integer listitem, integer value returns nothing
    local location loc
    local integer i = 0

    loop
        exitwhen listitem == i
        set list = LL_ly(list)
        set i = i + 1
    endloop
    set loc = Location(LL_i2r(value), GetLocationY(list))
    call MoveLocation(list, GetLocationX(list), LL_h2r(loc))
    set loc = null
endfunction

function LL_AddListItemBack takes location list, integer value returns nothing
    call LL_AddListItemInBackOf(list, LL_GetListSize(list) - 1, value)
endfunction


function LL_AddListItemInFrontOf takes location list, integer listitem, integer value returns nothing
    local location loc
    local integer i = 0

    loop
        exitwhen listitem == i
        set list = LL_ly(list)
        if list == null then
            call BJDebugMsg("|cffff0000Error:|r Linked List failure, listitem does not exist in function |cffffcc00LL_AddListItemBefore|r.")
            return
        endif
        set i = i + 1
    endloop
    set loc = Location(GetLocationX(list), GetLocationY(list))
    call MoveLocation(list, LL_i2r(value), LL_h2r(loc))
    set loc = null
endfunction

function LL_AddListItemFront takes location list, integer value returns nothing
    call LL_AddListItemInFrontOf(list, 0, value)
endfunction

function LL_GetListItem takes location list, integer listitem returns integer
    local integer i = 0

    loop
        exitwhen i == listitem
        set list = LL_ly(list)
        if list == null then
            call BJDebugMsg("|cffff0000Error:|r Linked List failure, listitem does not exist in function |cffffcc00LL_GetListItem|r.")
            return -1
        endif
        set i = i + 1
    endloop
    set i = LL_r2i(GetLocationX(list))
    return i
endfunction

function LL_FindListItem takes location list, integer value, integer ignores returns integer
    local integer i = 0
    local integer j

    loop
        set j = LL_r2i(GetLocationX(list))
        if j == value then
            set ignores = ignores - 1
        endif
        exitwhen ignores == -1
        set list = LL_ly(list)
        if list == null then
            return -1
        endif
        set i = i + 1
    endloop
    return i
endfunction

function LL_UpdateListItem takes location list, integer listitem, integer value returns nothing
    local integer i = 0
    loop
        exitwhen i == listitem
        set list = LL_ly(list)
        if list == null then
            call BJDebugMsg("|cffff0000Error:|r Linked List failure, listitem does not exist in function |cffffcc00LL_UpdateListItem|r.")
            return
        endif
        set i = i + 1
    endloop
    call MoveLocation(list, LL_i2r(value), GetLocationY(list))
endfunction

function LL_RemoveListItem takes location list, integer listitem returns nothing
    local integer i = 0
    local location loc

    if listitem == 0 then
        set loc = LL_ly(list)
        if loc != null then
            call MoveLocation(list, GetLocationX(loc), GetLocationY(list))
            set listitem = 1
        endif
        set loc = null
    endif
    loop
        exitwhen i == listitem
        set loc = list
        set list = LL_ly(list)
        if list == null then
            call BJDebugMsg("|cffff0000Error:|r Linked List failure, listitem does not exist in function |cffffcc00LL_RemoveListItem|r.")
            return
        endif
        set i = i + 1
    endloop
    if GetLocationY(loc) > 0. and list != null then
        call MoveLocation(loc, GetLocationX(loc), GetLocationY(list))
    else
        call MoveLocation(loc, GetLocationX(loc), 0)
    endif
    call RemoveLocation(list)
    set loc = null
endfunction

function LL_DestroyList takes location list returns nothing
    local location loc

    loop
        exitwhen GetLocationY(list) == 0.
        set loc = list
        set list = LL_ly(list)
        call RemoveLocation(loc)
        if list == null then
            call BJDebugMsg("|cffff0000Error:|r Linked List critical failure, unable to succesfully destroy list in function |cffffcc00LL_DestroyList|r.")
            return
        endif
    endloop
    call RemoveLocation(list)
    set loc = null
endfunction
» Функции С РБ
function LL_ly takes location l returns location
    return GetLocationY(l)
    return null
endfunction

function LL_r2i takes real r returns integer
    return r
    return 0
endfunction

function LL_i2r takes integer i returns real
    return i
    return 0.
endfunction

function LL_h2r takes handle h returns real
    return h
    return 0.
endfunction
Старый 15.12.2013, 19:10
DioD

offline
Опыт: 45,134
Активность:
собственные попытки решить проблему?
тут работы на 5 минут если что.
Старый 15.12.2013, 21:12
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
в той теме примеры
function Int2Group takes integer i returns group
    call SaveFogStateHandle(MyHash,0,0,ConvertFogState(i))
    return LoadGroupHandle(MyHash,0,0)
endfunction
такие
ввели integer получили хэндл, а тут location ввели его и получили
function LL_ly takes location l returns location
call SaveFogStateHandle(MyHash,0,0,ConvertFogState(а сюда чё списывать? там был тот integer, но точка то не integer))
return LoadLocationHandle(MyHash,0,0)
endfunction
Старый 15.12.2013, 21:58
DioD

offline
Опыт: 45,134
Активность:
собственные попытки это код, написанный, оформленный, с отладкой, но при этом он не работает или работает не так как нужно.
где это всё, где хоть одна строка отладочного вывода?
да и в коде прекрасно видно что в Y хранится следующая точка, а в X хранится пейлоад, система отвратительная и просто жутчайшая.
Старый 16.12.2013, 02:36
ScorpioT1000
Работаем
offline
Опыт: отключен
это линкед лист вы так имплементите?))
Старый 16.12.2013, 05:11
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
((код jass
functionLL_ly takes location loc returns location
call SaveFogStateHandle(MyHash,0,0,ConvertFogState(R2I(GettLocationY(loc)+0.05)))
return LoadLocationHandle(MyHash,0,0)
endfunction
))
Вроде вот что должно получится, Y одного локейшена равен хендлу другого локейшена, но тут возможны баги ибо У локейшена это тип Real а не Integer...
Довольно странная ситема RB, зачам было изобретать такое?
Старый 16.12.2013, 06:24
DioD

offline
Опыт: 45,134
Активность:
автор системы слегка болеет, а может и не слегка, ни один человек в здравом уме не будет делать списки таким образом, для этого есть ванильные массивы как бы.
да и контроллер памяти хоть и не является тривиальной задачей, но очень и очень реализуем, делаем блоки по 16, сборщик мусора и метаданные, если подходить к вопросу грамотно, фрагментации не будет больше раза и доступ к данным можно будет реализовывать простой итерацией.
в худшем случае доступ будет реализован двумя чтениями из массива каждое 15 чтение (чтобы передвинуть оффсет на следующий блок)
Старый 16.12.2013, 07:10
ScorpioT1000
Работаем
offline
Опыт: отключен
не будем говорить, что линкед лист почти нигде не нужен, кроме списков обсерверов/хэндлеров/листенеров
Старый 16.12.2013, 11:14
DioD

offline
Опыт: 45,134
Активность:
вам не кажется что прямым назначением списка тут и не пахнет, весь код про доступ к случайному элементу (который включает луп по всем элементам)
Старый 16.12.2013, 11:54
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
DioD:
собственные попытки это код, написанный, оформленный, с отладкой, но при этом он не работает или работает не так как нужно.
где это всё, где хоть одна строка отладочного вывода?
я вообще не знаю как это работает, я хотел по быстрому перевести карту на новый патч, не переписывая половину кода,
я просто не понимаю эту функцию
function LL_ly takes location l returns location
    return GetLocationY(l)
    return null
endfunction
она создаёт точку, с пустой X координатой и координатой Y от другой точки ли что? тогда причём тут рб вообще.
в общем, если кто может дать рабочий код дайте.
Старый 16.12.2013, 12:57
ScorpioT1000
Работаем
offline
Опыт: отключен
16GB, это несложно, но я объясню =)
function LL_h2r takes handle h returns real
    return h
    return 0.
endfunction

function LL_ly takes location l returns location
    return GetLocationY(l)
    return null
endfunction
давай рассмотрим такой код
local location full = Location(1.0, 2.0)
local location y = LL_ly(full)  // = (location)full.x
local real ry = LL_h2r(y)       // = (real)y
// дальше можно еще так full = Location(1.0, ry) и по кругу =)
Мы создаём ссылку на объект (или хендл, в жассе все объекты хендлы) типа локация с именем full и записываем в него результат создания объекта Location с полями: full.x = 1.0, full.y = 2.0
Создаём еще один хендл типа location с именем "y" и присваиваем ему значение результата LL_ly(full), коим является Y-поле объекта full, преобразованное в тип "location handle"
дальше мы создаем real-переменную ry и присваиваем ей значение функции LL_h2r(y), коми является преобразованный хендл y в тип real
все эти операции, за исключением доставания поля y из локации, предназначены, чтобы обойти запрет интерпретатора и компилятора на присвоение переменных разного типа
ScorpioT1000 добавил:
грубо говоря, они зачемто сохраняют в хендл локации значение real-поля Y другой локации

Отредактировано ScorpioT1000, 16.12.2013 в 13:23.
Старый 16.12.2013, 13:13
DioD

offline
Опыт: 45,134
Активность:
как это зачем, чтобы потом доставить значение преобразовывать обратно и получать следующую точку!
это типа оптимальный метод постоения связанного списка случайного размера (хотя давать подмассив фиксированного размера чтобы на всё хватало было бы проще и не надо было бы парится ни с ретурн багом ни с преобразованиями.
отладка делается проще чем вы думаете, достаточно после метода показывать то значение которое он выдаёт, а до метода то значение которое в этот самый метод попадает, чтобы было видно что было до и что было после.
Старый 16.12.2013, 15:55
ScorpioT1000
Работаем
offline
Опыт: отключен
но не факт, что в рандомном месте вместо локейшона будет другой объект в памяти
ScorpioT1000 добавил:
вот нормальный LinkedList www.wc3c.net/showthread.php?t=103604
Старый 16.12.2013, 17:57
DioD

offline
Опыт: 45,134
Активность:
я могу предложить соревнование:
кое кто делает отладку в коде и публикует результаты этой отладки.
я на основании результатов отладки делаю фикс, вернее не так, если отладка сделана грамотно я делаю фикс, вне зависимости от того, имеют результаты отладки хоть какойто смысл (главное чтобы был proof of work с вашей стороны)
думаю это будет честно, вы показываете что стараетесь и получаете, что хотите.
я лично не вижу смысла в связанном списке 1 к 1 так как в списке всегда нужны все объекты разом, а для этого есть массивы (соответственно мой солюшин будет про growablearray)
Старый 16.12.2013, 19:47
ScorpioT1000
Работаем
offline
Опыт: отключен
список нужен только тогда, когда ты интенсивно удаляешь из рандомного его места и при этом не должен меняться порядок
Старый 16.12.2013, 20:05
Ответ

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

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

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

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



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