Я попытался создать библиотеку, которая даёт специальный ид юниту по его хэндлу, но ничего не работает, хотя ошибок я не замечаю. В чем проблема?
library UnitSpecialId
    private integer CountedUnits
    private integer array HandleIdOfUnit
    private integer array SpecialId
    
    
         private function CheckUnitId takes unit u returns boolean
            call BJDebugMsg("2")
            local integer i = GetHandleId(u)
            local integer index = 1
            local boolean b = false
            loop
                if (i==HandleIdOfUnit[index]) then
                    set b = true
                    set index = CountedUnits
                endif
                call BJDebugMsg(I2S(index)+" - index")
                exitwhen (index >= CountedUnits)
                set index = index+1
            endloop
            call BJDebugMsg("3")
            return b
            endfunction


        public function GiveUnitId takes unit u returns nothing
            call BJDebugMsg("1")
            if CheckUnitId(u) then
                return
            endif
            call BJDebugMsg("4")
            set CountedUnits = CountedUnits+1
            set HandleIdOfUnit[CountedUnits] = GetHandleId(u)
            set SpecialId[CountedUnits] = CountedUnits
        endfunction

        
            
        public function GetUnitId takes unit u returns integer
            local integer i = GetHandleId(u)
            local integer index = 1
            local integer id = 0
            loop
                if (i==HandleIdOfUnit[index]) then
                    set id = SpecialId[index]
                    set index = CountedUnits
                endif
                exitwhen (index >= CountedUnits)
                set index = index+1
            endloop
            return id
        endfunction
            
endlibrary

library test initializer testfunc

function testfunc takes nothing returns nothing
    call BJDebugMsg("start")
    local unit u = CreateUnit(Player(0),'h000',0,0,0)
    call UnitSpecialId_GiveUnitId(u)
    call BJDebugMsg(I2S(UnitSpecialId_GetUnitId(u)))
    call BJDebugMsg("end")
endfunction

endlibrary
После того, как выводит переменную index(там 1) в функции CheckUnitId - перестаёт работать. 3 не выводится в чат.

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

пустые integer по дефолту равны
тому, что было в памяти на момент её выделения под переменную. Выделение памяти и её очистка - разные процессы, именно поэтому считается хорошим тоном задавать значения перед тем, как планируешь их использовать.
0
19
7 лет назад
0
Похожие вопросы:

ответ
Nirvana мод. Поищи информацию о нём. Там всё чудесно в этом плане вроде как реализовано.
ответ
Думал использовать чисто для экономии времени. По хорошему конечно надо самому написать системки, да все руки не доходят.
Может тогда подскажите, есть ли готовые более менее пригодные для использования. Сам всегда делал через торнадо, разве это уже не модно?
ответ
У меня всё работает, просто прописываю эти нативки в коде самой карты, вот карта, здесь и урон изменяется.
Чтобы typecast работал в JNGP нужно создать аж 3 переменных!
Какие три? Я только две использую:
integer array l__A
integer A

1
17
7 лет назад
Отредактирован ledoed
1
ты прямо в цикле выводи сколько он сделал циклов ,может тупо обрыв потока и к глобалке присвой значения
0
10
7 лет назад
0
так и делаю, выводит 1
private function CheckUnitId takes unit u returns boolean
            call BJDebugMsg("2")
            local integer i = GetHandleId(u)
            local integer index = 1
            local boolean b = false
            loop
                if (i==HandleIdOfUnit[index]) then
                    set b = true
                    set index = CountedUnits
                endif
                call BJDebugMsg(I2S(index)+" - index")//=====тут=====
                exitwhen (index >= CountedUnits)
                set index = index+1
            endloop
            call BJDebugMsg("3")
            return b
            endfunction
Установил переменной CountedUnits изначальное значение 0 и сработало. Странно, я думал пустые integer по дефолту равны нулю или причина в чем-то другом?
0
30
7 лет назад
0
пустые integer по дефолту равны
тому, что было в памяти на момент её выделения под переменную. Выделение памяти и её очистка - разные процессы, именно поэтому считается хорошим тоном задавать значения перед тем, как планируешь их использовать.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.