2014-04-09 6 views
1
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 

위의 함수를 사용하여 문자열을 분할했습니다. 이전에는 작동했지만 이번에는 "call stack이 최대 깊이 100을 초과했습니다. 함수가 우연히 스스로를 호출하지 않습니다. " 왜이 오류가 발생하는지 알기 쉽게 설명했기 때문에 스크립트의 나머지 부분과 동일한 분할 기능이 제대로 작동하고 있으므로이 동작은 무작위로 보입니다.호출 스택이 최대 깊이 100, 루아를 초과했습니다

은 편집 : 그것은 이전 일 이후 예, isWhiteSpace 나에게 제공하는 다음과 같은 코드가되었다는, 나는이를 변경되어 있지 않다. 여기 isWhite 기능은 다음과 같습니다

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

무엇을하려는 것입니까? 공백 주위의 단어를 분할 하시겠습니까? 그것은 패턴과 gmatch를 사용하는 것이 더 좋을 것입니다. – dr01d3k4

+0

@ dr01d3k4 : 그렇습니다. isWhiteSpace가 나에게 제공되었고 다음 코드가 있습니다. 이전에 작동 한 이후로 변경하지 않아도됩니다. 여기에 isWhite 함수가 있습니다 : function _isWhite (byte) return 바이트 == 32 또는 byte == 9 end –

+0

이 오류의 원인을 알고 싶습니다. –

답변

0

그래서 모두 _g_f 자신을 호출하고 _g 통화 _f. 그래서 재귀 정지 조건이 너무 약합니다. 에서 _g 내가 볼

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

내가 끝낼 때> = #s. 이 일이 결코 발생하지 않으면 무한 재귀가 발생합니다. 내가 어떻게 변화 하는지를 코드를보고 말을 열심히하지만,이 라인을 기반으로 :

i = i+#rs[#rs] 

은 어떤 값으로 나타납니다 만, 지금까지 도달 할 것이다 조건을 중지 보장이 있다면 말할 수 없다 . , 내가 #S보다 큰 어떤 경우의 나머지 부분을 수행 정지 재귀 조건이 충분히 강하다면 말을 다시 열심히

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

#(c..w) > maxLen 

같습니다 _f으로는 더 나쁘다 함수는 작동합니까? findWord()은 비어 있지 않은 문자에 대해서는 < #s를 반환하지만, 비어있는 경우에는 어떤 결과가 나올지 확신하지 못합니다.

가장 좋은 방법은 _g_f의 추적을 제공하는 인쇄 명령문을 입력하고 매개 변수를 수신하는 것입니다. 이는 놓치고있는 정지 조건을 명확하게 알려줍니다.

관련 문제