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
答案 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
以及收到的参数,这将清楚地告诉您错过了哪些停止条件。