lua — Lua5.2 встроен в переполнение стека

Я впервые пытаюсь встроить Lua в C ++. Я искал 2 дня, но большинство интернет-пользователей используют lua5.1, что несовместимо с lua5.2. Поэтому я прочитал немного документации на lua, пример исходного кода и в итоге получаю следующее:

main.cpp:

#include "luainc.h"#include <iostream>

int main(){
int iErr = 0;
lua_State *lua = luaL_newstate ();  // Open Lua
luaopen_io (lua);    // Load io library

if ((iErr = luaL_loadfile (lua, "hw.lua")) == 0)
{
std::cout<<"step1"<<std::endl;

if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
{
std::cout<<"step2"<<std::endl;

lua_getglobal (lua, "helloWorld");    // Push the function name onto the stack

if (lua_type(lua, lua_gettop(lua)) == LUA_TNIL) {
// if the global variable does not exist then we will bail out with an error.
std::cout<<"global variable not found : helloworld"<<std::endl;

/* error so we will just clear the Lua virtual stack and then return
if we do not clear the Lua stack, we leave garbage that will cause problems with later
function calls from the application. we do this rather than use lua_error() because this function
is called from the application and not through Lua. */

lua_settop (lua, 0);
return -1;
}

// Function is located in the Global Table
/* lua_gettable (lua, LUA_GLOBALSINDEX);  */ //lua5.1
lua_pcall (lua, 0, 0, 0);
}
}

lua_close (lua);

return 0;
}

hw.lua:

-- Lua Hello World (hw.lua)
function helloWorld ()
io.write ("hello World")
end

luainc.h:

#ifndef __LUA_INC_H__
#define __LUA_INC_H__

extern "C"{
#include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lua.h>
#include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lauxlib.h>
#include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lualib.h>
}

#endif // __LUA_INC_H__

У меня нет ошибки, вывод:

step1
step2

это должно означать, что моя функция «helloworld» была найдена. Но так как я не вижу «Hello World» в выводе, я подозреваю, что функция не была вызвана. Что я делаю неправильно ?

Вот как я собираю свою программу:

g++ main.cpp -L/usr/local/include -I/usr/local/include -llua

3

Решение

Во-первых, почему бы и нет #include "lua.hpp", который приходит с Lua и делает в основном то, что ваш luainc.hделает?

Есть две проблемы с вашим кодом:

  1. Вы не выдаете сообщение об ошибке, когда luadL_loadfile выходит из строя.

  2. Ты используешь lua_pcall звонить helloWorld но не проверяет его возвращаемое значение.

Когда вы меняете lua_pcall в lua_call вы получаете это сообщение об ошибке:

попытка индексировать глобальное ‘io’ (нулевое значение)

Это означает, что вы забыли установить глобальный io после звонка luaopen_io, Просто добавь lua_setglobal(lua,"io")и это работает. В отличие от Lua 5.1, Lua 5.2 не устанавливает глобальные переменные автоматически при открытии библиотек, если только сама библиотека не делает этого, что не рекомендуется.

Вам, вероятно, будет лучше позвонить luaL_openlibs открыть все стандартные библиотеки Lua без сюрпризов.

Вы можете также использовать luaL_dofile вместо luaL_loadfile и сохранить первый lua_pcall, Вы все еще должны проверить возвращаемое значение.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]