如何让lua调用一个向lua返回多个值的c++函数

Posted

技术标签:

【中文标题】如何让lua调用一个向lua返回多个值的c++函数【英文标题】:how to have lua call a c++ function that returns multiple values to lua 【发布时间】:2021-12-13 05:46:33 【问题描述】:

我的代码(部分) c++:

lua_register(L, "GetPosition", lua_GetPosition);

int lua_GetPosition(lua_State* L)

    Entity e = static_cast<Entity>(lua_tointeger(L, 1));
    TransformComponent* trans = TransformComponentPool.GetComponentByEntity(e);
    if (trans != nullptr)
    
        lua_pushnumber(L, trans->transform->position.x);
        lua_pushnumber(L, trans->transform->position.y);
        lua_pushnumber(L, trans->transform->position.z);
    
    else
    
        lua_pushnumber(L, 0);
        lua_pushnumber(L,0);
        lua_pushnumber(L, 0);
        LOG_ERROR("Transform not found");
    
    return 1;

卢阿:

local x = 69
local y = 69
local z = 69
x,y,z = GetPosition(e)
print("xyz =",x,y,z)

我预计“xyz = 1.0 1.0 1.0” 我得到“xyz = 1.0 nil nil”

什么是正确的方法让 lua 看到所有的返回值?

【问题讨论】:

您需要返回您推送的值的数量:return 3 你可以简单地写local x, y, z = GetPosition(e) btw。这里不需要用值初始化 x,y,z。 【参考方案1】:

当 Lua 调用你的函数时,它会检查它的返回值以找出它应该从堆栈中获取多少值。在你的情况下是1。 Lua 怎么知道你想要返回多少推送的值?

来自Lua 5.4 Reference Manual 4.6 Functions and Types:

为了与 Lua 正确通信,C 函数必须使用 遵循协议,它定义了参数和结果的方式 传递:一个 C 函数在它的堆栈中从 Lua 接收它的参数 直接顺序(首先推送第一个参数)。所以,当 函数启动,lua_gettop(L) 返回参数个数 由函数接收。第一个参数(如果有)位于索引 1 它的最后一个参数在索引 lua_gettop(L) 处。 返回值到 Lua,一个 C 函数只是将它们直接推入堆栈 (首先推送第一个结果),并且 在 C 中返回数量 结果。 堆栈中结果下方的任何其他值都将是 被 Lua 正确丢弃。像 Lua 函数一样,C 函数由 Lua 也可以返回很多结果。

例如,以下函数接收可变数量的 数字参数并返回它们的平均值和它们的总和:

 static int foo (lua_State *L) 
   int n = lua_gettop(L);    /* number of arguments */
   lua_Number sum = 0.0;
   int i;
   for (i = 1; i <= n; i++) 
     if (!lua_isnumber(L, i)) 
       lua_pushliteral(L, "incorrect argument");
       lua_error(L);
     
     sum += lua_tonumber(L, i);
   
   lua_pushnumber(L, sum/n);        /* first result */
   lua_pushnumber(L, sum);         /* second result */
   return 2;                   /* number of results */
 

【讨论】:

以上是关于如何让lua调用一个向lua返回多个值的c++函数的主要内容,如果未能解决你的问题,请参考以下文章

从lua的c源码了解lua栈结构和函数调用流程

lua socket c++ socket效率怎样

c++调lua时怎么检查lua的bug

Lua中返回值的丢失问题

Lua - C++ 集成:从 C++ 调用表中的函数

LUA怎么获取指定的函数返回值