Доброго времени суток.
Столкнулся с такой проблемой: цикл зависает, если внутри него много действий.
Это не весь код. Здесь не описаны действия, которые вне цикла и к нему никак не относятся. Если нужно, скину все.
Бажат циклы, находящиеся в конце функции 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 все так же не работало.

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

Существует лимит то ли на кол-во операций, то ли на время выполнения, то ли и на то и на другое. При превышении лимита поток молча рубится.
В качестве шаманства: попробуй завернуть каждый цикл в отдельную функцию. Врядли это поможет само по себе, но зато потом проще будет переходить к следующему шагу - разнесению на отдельные потоки.
0
20
10 лет назад
0
Я думаю, ты просто не написал endloop.
Нужно писать:
loop
exitwhen (condition)
{commands}
endloop.
Но, возможно, у тебя там CJASS и я ошибаюсь.
0
1
10 лет назад
Отредактирован SubSira
0
Я думаю, ты просто не написал endloop.
Нужно писать:
loop
exitwhen (condition)
{commands}
endloop.
Но, возможно, у тебя там CJASS и я ошибаюсь.
Это cJass, все верно:
while (condition) { открывающая скобка, все равно, что просто "loop"
} закрывающая скобка, все равно, что "endloop"
0
20
10 лет назад
0
while (condition) { открывающая скобка, все равно, что просто "loop"
} закрывающая скобка, все равно, что "endloop"
Ты противоречишь сам себе, у тебя там
loop{
exitwhen i == 10
set tr = NewTrackable(x,y,Player(i),i2,color)
i=i+1
}
а не
while ( i <= 10 )
{
set tr = NewTrackable(x,y,Player(i),i2,color)
i=i+1
}

Если это тоже неверно, тогда извини за поднятий шум.
2
24
10 лет назад
2
Существует лимит то ли на кол-во операций, то ли на время выполнения, то ли и на то и на другое. При превышении лимита поток молча рубится.
В качестве шаманства: попробуй завернуть каждый цикл в отдельную функцию. Врядли это поможет само по себе, но зато потом проще будет переходить к следующему шагу - разнесению на отдельные потоки.
Принятый ответ
0
1
10 лет назад
0
PhysCraft:
while (condition) { открывающая скобка, все равно, что просто "loop"
} закрывающая скобка, все равно, что "endloop"
Ты противоречишь сам себе, у тебя там
loop{
exitwhen i == 10
set tr = NewTrackable(x,y,Player(i),i2,color)
i=i+1
}
а не
while ( i <= 10 )
{
set tr = NewTrackable(x,y,Player(i),i2,color)
i=i+1
}

Если это тоже неверно, тогда извини за поднятий шум.
Простите, не описал(
Я про циклы которые внизу функции main
prog:
Существует лимит то ли на кол-во операций, то ли на время выполнения, то ли и на то и на другое. При превышении лимита поток молча рубится.
В качестве шаманства: попробуй завернуть каждый цикл в отдельную функцию. Врядли это поможет само по себе, но зато потом проще будет переходить к следующему шагу - разнесению на отдельные потоки.
То есть все-таки ограничение есть?
Может, наговнокодить и поставить несколько циклов (while i!=5, while i!=10) и т. д. ? Это намного увеличит код, но, думаю, работать будет
Чтобы оставить комментарий, пожалуйста, войдите на сайт.