从lua调用c ++函数传递的参数较少

时间:2016-04-26 07:54:23

标签: c++ function lua

所以功能如下:

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端传递的参数。

此外,我尝试只推动一个对象,它正常工作。所以我不确定我是否搞砸了某个地方的参数编号

请说出你的意见

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

行。事情是这样的

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)