【问题标题】:Using LuaBridge with pointers to built-in types将 LuaBridge 与指向内置类型的指针一起使用
【发布时间】:2012-12-24 08:09:02
【问题描述】:

让我们考虑以下 C 函数:

void returnMultipleValuesByPointer(int* ret0, int* ret1, int* ret2)
{
    *ret0 = 0;
    *ret1 = 1;
    *ret2 = 2;
}

如何使用 LuaBridge 在 Lua 中公开它?所有文档和示例都说明了指向对象是类的复杂情况,但我找不到如何处理这样一个简单的情况......

简单的方法(即luabridge::getGlobalNamespace(L).addFunction("test", &returnMultipleValuesByPointer)) 编译但不理解要通过地址传递的值。

【问题讨论】:

    标签: c++ binding lua luabridge


    【解决方案1】:

    您不能直接执行此操作。您必须编写一个将参数转换为返回值的包装方法。这就需要编写这样的方法。例如,如果这些是返回值(即:它们不带参数):

    int lua_ReturnMultipleValuesByPointer(lua_State *L)
    {
      int ret0;
      int ret1;
      int ret2;
      returnMultipleValuesByPointer(&ret0, &ret1, &ret2);
      lua_pushinteger(L, ret0);
      lua_pushinteger(L, ret1);
      lua_pushinteger(L, ret2);
      return 3;
    }
    

    你需要用“addCFunction”注册它,因为它是一个标准的 Lua 函数。

    【讨论】:

    • 谢谢,这似乎工作正常,而且很容易用宏包装。
    【解决方案2】:

    如果你想做的是这样的:

    a=0
    b=0
    c=0
    test(a,b,c)
    -- NOW a is 0, b is 1, c is 2
    

    我认为这是不可能的。您应该恢复到这样的 lua 调用:

    a,b,c=test()
    

    现在,测试可以这样声明:

    luabridge::getGlobalNamespace(L).addCFunction("test", &returnMultipleValues)
    
    int returnMultipleValues (lua_State* L) {
        push(L,0);
        push(L,1);
        push(L,2);
        return 3;
    }
    

    【讨论】:

    • 这种情况下它在哪里调用C函数?
    • 如 sai: a,b,c=test() 在 LuaBRidge 中,CFunction 是一个实现底层堆栈管理的函数。因此,您将返回值推送到堆栈上并返回您推送了多少值使用的“推送”函数是您在 luabridge 中找到的模板化函数
    • 我的意思是returnMultipleValues在哪里调用了OP的原始函数returnMultipleValuesByPointer
    猜你喜欢
    • 2022-11-11
    • 2017-04-09
    • 2011-06-22
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多