2013-11-14 5 views
3

По какой-то причине код ниже порождает ошибку переполнения стека, если оператор else выполняется слишком много раз. Я пытаюсь, чтобы функция scene.targeting выбрала цель из objTable, переданную в параметрах, но действительны выборы только с .tgtFlag == false. Если функция выбирает цель, которая имеет .tgtFlag == true, она вызывает функцию scene.targeting, проходящую в том же наборе параметров.Переполнение стека Lua в рекурсивной функции в короне sdk

Линия, которая ломается, local theTarget = params.objTable[math.random(1, #params.objTable)], но только после else scene.targeting(params) end вызывается несколько раз.

Любая помощь была бы принята с благодарностью.

function scene.targeting(params) -- Targeting functions 

    function animateTarget(target) 
    if target.savedFlag == false then 
     transition.to(target, {time = 100, y = target.y - 15}) 
     transition.to(target, {time = 100, delay = 150, y = target.y, onComplete = animateTarget} ) 
    end 
    end 

    local theTarget = params.objTable[math.random(1, #params.objTable)] 
    if theTarget.tgtFlag == false then 
    theTarget.tgtFlag = true 
    animateTarget(theTarget) 
    else 
    scene.targeting(params) 
    end 
end 

ответ

4

Ссылаясь на Programming in Lua:

Хвост вызова является своего рода Goto, одетый, как вызов. Хвост вызова происходит, когда функция вызывает другое как последнее действие, поэтому ему больше нечего делать.

В вашем примере animateTarget явно не вызывается таким образом и может и будет страдать от переполнения стека. Либо перепишите его, чтобы использовать TCO, либо изменить его на нерекурсивную версию.

+0

Я не знал о вызовах хвоста. Отличный маленький трюк, чтобы не использовать стек. – joed4no

Смежные вопросы