Добавлен SubSira
Доброго времени суток.
Столкнулся с такой проблемой: цикл зависает, если внутри него много действий.
Это не весь код. Здесь не описаны действия, которые вне цикла и к нему никак не относятся. Если нужно, скину все.
Бажат циклы, находящиеся в конце функции main()
P.S. код находится в шапке карты.
Бажат циклы, находящиеся в конце функции main()
P.S. код находится в шапке карты.
globals
trigger t = CreateTrigger()
hashtable hash = InitHashtable()
trackable rEnd,gEnd,bEnd,aEnd
endglobals
trackable NewTrackable(float x,float y,player owner,int i,int color){
local trackable tr
local string s = ""
if GetLocalPlayer() == owner{
set s="Doodads\\Terrain\\InvisiblePlatformSmall\\InvisiblePlatformSmall.mdx"
}
set tr=CreateTrackable(s,x,y,0.00)
if i == 100{
if color == 0 {set rEnd = tr}
elseif color == 1 {set gEnd = tr}
elseif color == 2 {set bEnd = tr}
elseif color == 3 {set aEnd = tr}
}
call TriggerRegisterTrackableHitEvent(t,tr)
call SaveReal(hash,GetHandleId(tr),0,x)
call SaveReal(hash,GetHandleId(tr),1,y)
call SavePlayerHandle(hash,GetHandleId(tr),2,owner)
call SaveInteger(hash,GetHandleId(tr),3,i)
call SaveInteger(hash,GetHandleId(tr),4,color)
return tr
}
void CreateTrack(float x,float y,int i2,int color){
local trackable tr
local int i = 0
loop{
exitwhen i == 10
set tr = NewTrackable(x,y,Player(i),i2,color)
i=i+1
}
}
scope init initializer main{
private void main(){
local int i = 0
while i!=101{
call CreateTrack(-2650.00+i*6.40,-4960.00,i,0)
BJDebugMsg("1 "+I2S(i))
i=i+1
}
i = 0
while i!=101{
call CreateTrack(-2650.00+i*6.40,-5024.00,i,1)
BJDebugMsg("2 "+I2S(i))
i=i+1
}
i = 0
while i!=101{
call CreateTrack(-2650.00+i*6.40,-5088.00,i,2)
BJDebugMsg("3 "+I2S(i))
i=i+1
}
i = 0
while i!=101{
call CreateTrack(-2650.00+i*6.40,-5152.00,i,3)
BJDebugMsg("4 "+I2S(i))
i=i+1
}
}
Действия завершаются на втором цикле, когда переменная i == 74, и дальше ничего не происходит (вообще ничего, даже действия из остальных треггеров).
2 функции для работы с трекаблами взял (и немного подстроил под свою карту) из этой статьи.
Скажите, в чем проблема? Действительно ли в wc3 есть ограничение по кол-ву действий в цикле? Или же я допустил какую-то ошибку?
P.S. сделал 4 цикла, потому что в 1 все так же не работало.
P.S. сделал 4 цикла, потому что в 1 все так же не работало.
Принятый ответ
Существует лимит то ли на кол-во операций, то ли на время выполнения, то ли и на то и на другое. При превышении лимита поток молча рубится.
В качестве шаманства: попробуй завернуть каждый цикл в отдельную функцию. Врядли это поможет само по себе, но зато потом проще будет переходить к следующему шагу - разнесению на отдельные потоки.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Нужно писать:
exitwhen (condition)
{commands}
endloop.
Отредактирован SubSira
while (condition) { открывающая скобка, все равно, что просто "loop"
} закрывающая скобка, все равно, что "endloop"
exitwhen i == 10
set tr = NewTrackable(x,y,Player(i),i2,color)
i=i+1
}
{
set tr = NewTrackable(x,y,Player(i),i2,color)
i=i+1
}
Я про циклы которые внизу функции main
prog: То есть все-таки ограничение есть?
Может, наговнокодить и поставить несколько циклов (while i!=5, while i!=10) и т. д. ? Это намного увеличит код, но, думаю, работать будет