coronasdk中递归函数中的Lua堆栈溢出

coronasdk中递归函数中的Lua堆栈溢出,lua,coronasdk,Lua,Coronasdk,由于某种原因,如果else语句执行太多次,下面的代码将抛出堆栈溢出错误。我试图让scene.targeting函数从参数中传递的objTable中选择一个目标,但只有.tgtFlag==false的目标才是有效的选择。如果函数选择了一个.tgtFlag==true的目标,它将调用传入同一组参数的scene.targeting函数 断开的行是本地的target=params.objTable[math.random 1,params.objTable],但只有在多次调用else scene.tar

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

断开的行是本地的target=params.objTable[math.random 1,params.objTable],但只有在多次调用else scene.targetingparams 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
指:

尾部呼叫是一种伪装成呼叫的goto。当一个函数调用另一个函数作为其最后一个操作时,就会发生尾部调用,因此它没有其他事情可做


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

我不知道尾部调用。伟大的小技巧,不使用堆栈。