【问题标题】:calling a c++ function from lua passes less arguments从 lua 调用 c++ 函数传递的参数更少
【发布时间】:2016-08-19 21:54:15
【问题描述】:

所以函数是这样的:

send_success(lua_State *L){

    MailService *mls = static_cast<MailService *>(lua_touserdata(L, lua_upvalueindex(1)));
    Device *dev = static_cast<Device *>(lua_touserdata(L, lua_upvalueindex(2)));
    int numArgs = lua_gettop(L);
    TRACE << "Number of arguments passed is = " << numArgs;

   /* here I do some operation to get the arguments.
    I am expecting total of 5 arguments on the stack. 
    3 arguments are passed from function call in lua 
    and 2 arguments are pushed as closure 

   */
    string one_param = lua_tostring(L, 3, NULL)
    string two_param = lua_tostring(L, 4, NULL)
    string other_param = lua_tostring(L, 5, NULL)



}

现在将这个函数推送到 lua 堆栈上,我已经完成了以下操作

lua_pushstring(theLua, "sendSuccess");
lua_pushlightuserdata(theLua, (void*) mls);
lua_pushlightuserdata(theLua, (void*) this);
lua_pushcclosure(theLua, lua_send_success,2);
lua_rawset(theLua, lua_device); // this gets  me device obj in lua

从 lua 调用它,我会这样做

obj:sendSuccess("one param","second param","third param")

但是当我检查参数的数量时。它应该给出 5 个参数。相反,只传递了 4 个参数。 我做了一些测试,我传递的两个对象是否正确传递了轻用数据。它们被正确传递了。

这里唯一缺少的是,缺少一个从 lua 端传递的参数。

我也试过只推一个对象,它工作正常。所以我不确定我是否在某个地方弄乱了参数编号

请说出你的意见

【问题讨论】:

    标签: c++ function lua


    【解决方案1】:

    作为闭包的一部分创建的用户数据对象不会作为参数传递给函数,它们放置在状态的另一个位置。

    这意味着您用于获取 lua_tostring 参数的偏移量是错误的。

    【讨论】:

    • 你能举一个例子来说明我应该如何获取实际参数,以我的例子作为上下文吗?
    【解决方案2】:

    好的。所以事情是

    lua_pushclosure 将用户数据保存在lua_stack 的单独空间中。在该堆栈中,偏移量 1 和 2 代表第一个和第二个对象

    lua_pushlightuserdata(theLua, (void*) mls);
    lua_pushlightuserdata(theLua, (void*) this);
    lua_pushcclosure(theLua, lua_send_success,2);
    

    但在那之后我要去第三个第三个,假设我已经访问了第二个位置。但这是错误的。正确的做法是考虑pushclousure 在堆栈上只占用一个空间,而不管lightuserdata 被推送多少次,剩余的参数可以从第二个偏移量开始访问。所以下面的代码对我有用:

      string one_param = lua_tostring(L, 2, NULL)
      string two_param = lua_tostring(L, 3, NULL)
      string other_param = lua_tostring(L, 4, NULL)
    

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 2014-05-14
      • 2013-02-13
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2013-04-14
      • 2021-12-07
      相关资源
      最近更新 更多