【问题标题】:Calling Lua function from C++ not working with 2 defined functions从 C++ 调用 Lua 函数不能使用 2 个定义的函数
【发布时间】:2013-10-21 05:08:53
【问题描述】:

我有一个我写的 Lua 脚本,里面有两个函数:

function CallbackServerStatus ()
    print("Status exec")
end

function CallbackServerInit ()
    print("Server initialized\n")
end

这就是我尝试在 C++ 中调用 Lua 函数的方式:

printf("LUA | Exec LUA: CallbackServerInit()\n");
luaL_dofile(LuaEngine::state, "loaders/test.lua");
lua_getglobal(LuaEngine::state, "CallbackServerInit");
lua_pcall(LuaEngine::state, 0, 0, 0);

但是在控制台中"Server initialized\n" 是看不到的。我在这里做错了吗?甚至没有错误,当我删除CallbackServerStatus() 函数时,我只看到"Server initialized\n"

【问题讨论】:

  • lua_pcall 返回什么?如果是错误,压栈的错误信息的内容是什么?
  • luaL_dofile 返回什么?如果有错误,函数没有定义。
  • 调用 lua_pcall 时出现错误:attempt to call a nil value。当我删除我的 LUA 脚本中的第一个函数时它不会弹出错误,我只是不明白。
  • @Zinglish 好吧,如果你这么说,这意味着CallbackServerStatus() 没有注册。
  • 您能否将您的 Lua 脚本加载到在控制台中运行的 Lua 中而不会出现错误?

标签: c++ lua


【解决方案1】:

好的,我发现我的脚本中有一个非打印字符导致脚本失败。

感谢您的回答!

【讨论】:

    【解决方案2】:

    我认为您可能也需要重组代码。

    void execute(std::string szScript)
    {
      int nStatus = 0;
    
      nStatus = luaL_loadfile(L, szScript.c_str());
      if(nStatus == 0){ nStatus = lua_pcall(L, 0, LUA_MULTRET, 0); }
    
      error(nStatus);
    }
    
    void callFunction(std::string szName)
    {
        int nStatus = 0;
    
        lua_getglobal(L, szName.c_str());
        nStatus = lua_pcall(L, 0, LUA_MULTRET, 0);
    
        error(nStatus);
    }
    
    void error(int nStatus)
    {
        if(nStatus != 0)
        {
          std::string szError = lua_tostring(L, -1);
          szError = "LUA:\n" + szError;
          MessageBox(NULL, szError.c_str(), "Error", MB_OK | MB_ICONERROR);
          lua_pop(L, 1);
        }
    }
    

    我已经为我的应用程序编写了这个。你也可以使用它。这样您就可以在编译脚本或调用函数时观察到任何类型的错误。

    execute("C:\test.lua");
    callFunction("MyFunc");
    

    【讨论】:

    • 谢谢你的帮助 :) 它很有帮助。我只是想让这个东西运行,然后构建你如何完成它的代码,我什至似乎无法让它运行:/
    • @Zinglish 这就是重点。用我的重构你的代码,然后当你想执行你的脚本时,如果有任何错误,它会被弹出。
    猜你喜欢
    • 2015-07-14
    • 2014-09-01
    • 2015-02-12
    • 2013-02-19
    • 2015-12-30
    • 2022-01-04
    • 2021-04-15
    • 2018-12-21
    相关资源
    最近更新 更多