Lua堆栈在corona sdk的递归函数中溢出

时间:2013-11-14 10:16:58

标签: lua corona

由于某种原因,如果else语句被执行了太多次,下面的代码会抛出堆栈溢出错误。我正在尝试使用scene.targeting函数从参数中传递的objTable中选择一个目标,但只有.tgtFlag == false的目标才是有效选择。如果函数选择具有.tgtFlag == true的目标,则它会调用传递给同一组参数的scene.targeting函数。

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

1 个答案:

答案 0 :(得分:4)

参考Programming in Lua

  

尾部呼叫是一种打扮成呼叫的goto。当一个函数将另一个函数作为最后一个动作调用时,会发生尾调用,因此它没有其他任何操作。

在您的示例中,animateTarget显然不会以这种方式调用,并且可能并且将遭受堆栈溢出。要么重写它以使用TCO,要么将其更改为非递归版本。