如何让 Lua 调用 C++ 函数并返回多个值给 Lua

我的代码(部分)

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;
}

Lua:

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 能够获取到所有的返回值呢?

原文链接 https://stackoverflow.com/questions/69747056

点赞
stackoverflow用户2858170
stackoverflow用户2858170

当 Lua 调用你的函数时,它会检查其返回值以确定应该从堆栈中获取多少个值。在这个例子中是 1。否则,Lua 怎么知道你想要返回多少个推送的值呢?

来自 Lua 5.4 参考手册 4.6 函数和类型:

为了正确地与 Lua 通信,C 函数必须使用以下协议,该协议定义了参数和结果的传递方式:C 函数在其堆栈中按直接顺序(第一个参数最先被推入)从 Lua 中接收其参数。所以,当函数开始时,lua_gettop(L) 返回函数接收的参数数量。第一个参数(如果有)位于索引 1,最后一个参数位于索引 lua_gettop(L)。 为了将结果返回给 Lua,C 函数只需按直接顺序(第一个结果先被推入),将其推到堆栈中,并在 C 中返回结果的数量。 堆栈中结果之下的任何其他值都将由 Lua 正确地丢弃。和 Lua 函数一样,由 Lua 调用的 C 函数也可以返回多个结果。

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

 static int foo (lua_State *L) {
   int n = lua_gettop(L);    /* 参数的数量 */
   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);        /* 第一个结果 */
   lua_pushnumber(L, sum);         /* 第二个结果 */
   return 2;                   /* 结果的数量 */
 }
2021-10-28 07:27:39