【问题标题】:Lua: fails to get field after loading a second string;Lua:加载第二个字符串后无法获取字段;
【发布时间】:2016-07-05 16:36:11
【问题描述】:

下午好, 我正在开发一个 LUA/C++ 应用程序,我需要 lua 能够递归地调用其他 lua 代码,例如:C++ 调用 lua 函数,lua 函数从另一个使用注册的 C 函数加载的字符串调用另一个 lua 函数在第一个 lua 函数的开头运行;

这是我正在遵循的步骤:

    lua_State* state = luaL_newstate();
    luaL_openlibs(state);
    lua_register(state, "secondLua", secondLua);
    lua_getfield( _luaState, LUA_GLOBALSINDEX, "init" );
    lua_pcall( _luaState, 0, 0, 0 );

    int secondLua(lua_State* state){
    char* myString[128] = "function init2()\n io.write(\"hello\")\n end";
    luaL_loadstring(pLuaState, myString);
    lua_getfield(pLuaState,LUA_GLOBALSINDEX, "init2"); // function init2 declared on myString
    lua_pcall(pLuaState, 0, LUA_MULTRET, 0);
//getting "attempt to call a nil value" here

    return 0;  
    }

感谢任何帮助,其次,我想知道是否有一种方法可以将第二个函数命名为“init”以及第一个函数;

PS:我在 LUAJIT 上使用的是 C++14 和 lua 5.1,我不能使用 lua 的 dofile;

【问题讨论】:

  • 与您的实际问题无关,但您是否考虑过使用包装库,例如 sol
  • 为什么这个标签是[c]
  • @KemyLand 因为我猜这是 Lua 的 C API。
  • @Jakuje:OP 无论如何都在谈论 C++,而不是 C。
  • 这个编译?对lua_getfield 的第二次调用缺少参数。

标签: c++ lua luajit


【解决方案1】:

lua_loadstring() 编译提供的源代码并将 Lua 块放入堆栈。但它不会执行它,所以 init2() 在你期望的时候仍然没有定义。
将 lua_loadstring() 替换为 luaL_dostring() 以实际运行该块并定义新的 lua 函数。或者在 lua_loadstring() 之后调用 lua_pcall()。实际上,luaL_dostring() 正是这样做的——lua_loadstring() 后跟 lua_pcall()。

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 2015-12-14
    • 1970-01-01
    • 2022-06-17
    • 2017-07-27
    • 2022-12-13
    • 2014-06-08
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多