调用堆栈已超过最大深度限制 100,Lua。

我有一个函数用于拆分字符串,之前一直可用,但现在开始出现错误:“堆栈调用超出了100的深度极限,验证函数没有意外地调用它自己。” 有什么想法是为什么我可能会遇到这个错误,这种行为似乎很随机,因为我对其余的脚本和相同的拆分函数也很确定已经正常工作。

编辑: 是的,isWhiteSpace 已经对我提供了,它有以下代码,我不应该改变它,因为之前它已经工作了。 下面是 isWhite 函数:

function _isWhite(byte)
  return byte == 32 or byte == 9
end
点赞
用户869951
用户869951

所以 _g_f 都在调用它们自己,而 _g 也调用了 _f。因此,很明显你所设定的递归停止条件太弱了。在 _g 中,我看到了以下代码:

  if i < #s then
     local s = ...
     return _g(s,1,'',rs)
  else
     return rs
  end

当 i>= #s 时就会停止。如果这个条件永远不满足,您将遭遇无限递归。通过查看代码,很难说 i 的变化情况,但基于以下这一行:

i = i+#rs[#rs]

看起来它是一个可变的值,但无法确定是否保证会到达停止条件。在 _f 中更糟:停止递归的条件是

if i == #s then return c..w end

#(c..w) > maxLen

同样很难说这是不是足够强的条件:如果 i 大于 #s,函数的其余部分会怎样运作?虽然 findWord() 返回 i<#s 时 s 不为空,但是如果 s 为空会发生什么,还不确定。

查找遗漏的停止条件的最好方法是添加一些输出语句,以跟踪 _g_f,以及接收到的参数。这将清楚地告诉您哪些停止条件被忽略了。

2014-04-09 18:40:33