2013-11-14 100 views
3

由於某些原因,如果else語句被執行了太多次,下面的代碼會引發堆棧溢出錯誤。我試圖讓scene.targeting函數從傳遞參數objTable中選擇一個目標,但只有具有.tgtFlag == false的目標纔是有效的選擇。如果函數選擇一個具有.tgtFlag == true的目標,它會調用傳入同一組參數的scene.targeting函數。在corona sdk遞歸函數中的Lua堆棧溢出

中斷的行是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

A尾巴呼叫是一種跳轉的穿着作爲一個呼叫。當一個函數調用另一個函數作爲其最後一個操作時會發生尾部調用,因此它沒有其他任何操作。

在你的例子中,animateTarget顯然不是以這種方式調用的,並且可能並且會受到堆棧溢出的困擾。重寫它以利用TCO或將其更改爲非遞歸版本。

+0

我不知道尾巴呼叫。偉大的小技巧不使用堆棧。 – joed4no