2016-06-13 1 views
-1

У меня есть интерпретатор Lua, что всякий раз, когда я делаю синтаксическую ошибку в своем коде, возвращаемое сообщение об ошибке просто attempted to call a string value вместо значимого сообщения об ошибке. Например, если я запускаю этот код Lua:Описательные сообщения об ошибках для ошибок синтаксиса Lua

for a= 1,10 
    print(a) 
end 

Вместо возвращения содержательную 'do' expected near 'print' и номер строки, он просто возвращает ошибку attempted to call a string value.

Мой код C++ выглядит следующим образом:

void LuaInterpreter::run(std::string script) { 
    luaL_openlibs(m_mainState); 

    // Adds all functions for calling in lua code 
    addFunctions(m_mainState); 

    // Loading the script string into lua 
    luaL_loadstring(m_mainState, script.c_str()); 

    // Calls the script 
    int error =lua_pcall(m_mainState, 0, 0, 0); 
    if (error) { 
     std::cout << lua_tostring(m_mainState, -1) << std::endl; 
     lua_pop(m_mainState, 1); 
    } 
} 

Заранее спасибо!

ответ

7

Ваша проблема заключается в том, что luaL_loadstring не удается загрузить строку, так как это не правильный код Lua. Но вы никогда не потрудитесь проверить его возвращаемое значение, чтобы узнать это. И поэтому вы завершаете попытку выполнить команду скомпилировать ошибку, чтобы она нажала на стек, как если бы это была действительная функция Lua.

Правильный способ использования этой функции заключается в следующем:

auto error = luaL_loadstring(m_mainState, script.c_str()); 
if(error) 
{ 
    std::cout << lua_tostring(m_mainState, -1) << std::endl; 
    lua_pop(m_mainState, 1); 
    return; //Perhaps throw or something to signal an error? 
} 
1

Я был в состоянии решить проблему, заменив

luaL_loadstring(m_mainState, script.c_str()); 

// Calls the script 
int error =lua_pcall(m_mainState, 0, 0, 0); 

с кодом

int error = luaL_dostring(m_mainState, script.c_str()); 
Смежные вопросы