在corona sdk中的递归函数中发生了Lua堆栈溢出。

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

出现问题的代码行是 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
点赞
用户752976
用户752976

参考 Programming in Lua

尾调用是一种通过调用来实现的 goto。尾调用发生在函数调用另一个函数作为其最后一个操作时,因此它没有其他事情要做。

在您的示例中,很明显 animateTarget 没有以这种方式调用,因此可能会遭受栈溢出。要么将其改写为利用 TCO,要么将其改为非递归版本。

2013-11-14 10:32:55