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

时间:2014-04-09 12:10:55

标签: lua

function findWord(s,i)
   -- find first word in given text
   local j = i+1

   while not _isWhite(s:byte(j)) and j < #s do  -- getting error here
      j = j + 1
   end
   return s:sub(i,j), j
end  

function splitText(s,maxLen)
   -- split text into chunks of maxLen length

    rs ={}
   local function _g(s,i,c,rs) 
      -- recursively split text 

     local function _f(s,i,c)      
         -- recursively find words and add each word to a chunk     
         local w,i = findWord(s,i)                

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

         if  #(c..w) <= maxLen  then
            c = c..w 
            s = s:sub(i+1,#s,true)
            return _f(s,1,c)

         else
            return c
         end
      end         

      rs[#rs+1] = _f(s,1,'')
      i = i+#rs[#rs]      

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

   return _g(s,1,'',rs)
end

我有上面的功能来分割一个字符串,它已经提前工作但是这次它开始给出错误&#34;调用堆栈超过了最大深度100,验证函数没有意外调用自己。&# 34; 任何想法我可能会得到这个错误,这种行为似乎是随机的,因为我非常肯定脚本的其余部分和相同的拆分功能一直工作正常。

修改 是的,isWhiteSpace是提供给我的,并且有以下代码,我不应该更改它,因为它之前工作。这是isWhite功能:

function _isWhite(byte) 
  return byte == 32 or byte == 9 
end

1 个答案:

答案 0 :(得分:1)

因此,_g_f都会自行调用,_g调用_f。很明显,你所拥有的递归 - 停止条件太弱了。在_g我看到了

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

当i&gt; = #s时将停止。如果这种情况永远不会发生,您将获得无限递归。通过查看代码如何变化很难说,但基于这一行:

i = i+#rs[#rs] 

它似乎有一些价值,但不能说是否有保证会达到停止条件。使用_f会更糟:停止递归条件是

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

#(c..w) > maxLen

再次很难说这是否足够强大:如果我大于#s,那么该函数的其余部分是否有效?虽然findWord()返回i&lt; #s表示非空s,但不确定如果s为空将会发生什么。

最好的方法是提供一些打印语句,让您跟踪_g_f以及收到的参数,这将清楚地告诉您错过了哪些停止条件。