【问题标题】:Reading a table when function has many argument return an error当函数有很多参数时读取表会返回错误
【发布时间】:2015-08-17 19:28:18
【问题描述】:

我正在尝试在我正在开发的库中读取 Lua 函数中的数组。

当我用一个参数调用函数时,比如

xyz = {3, 4, 5}
setxyz(xyz)

我正确读取了数组,而如果我添加第二个参数

xyz = {3, 4, 5}
setxyz(xyz, 3)

程序崩溃。

问题出在ReadXYZValue 函数内的lua_next 调用中,这会在我第一次去那里时使程序崩溃。

我该如何解决?

typedef struct {
  double x;
  double y;
  double z;
} XYZ;

// Function that I call in Lua
static int lua_ts_getxyz(lua_State *L)
{
  if (0 == L)
  {
    return 1;
  }
  int argumentsNumber = lua_gettop(L);
  XYZ xyz;
  bool res;
  res = ReadXYZValue(L, &xyz); // Problem in this call
  if (false == res)
  {
    return 1;
  }
  double range;
  res = ReadNumericValue(L, &range);
  if (false == res)
  {
    return 1;
  }
  return 1;
}

bool ReadNumericValue(lua_State *L, double *range)
{
  if (false == lua_isnumber(L, 1))
  {
    return false;
  }
  *range = lua_tonumber(L, -1);
  return true;
}

bool ReadXYZValue(lua_State *L, XYZ *xyz)
{
  if (false == lua_istable(L, 1))
  {
    return false;
  }
  size_t tableSize = lua_rawlen(L, 1);
  if (tableSize != 3)
  {
    return false;
  }

  bool res = true;
  size_t i = 0;
  lua_pushnil(L);
  double llaArray[3];
  while (lua_next(L, -2) != 0) // with only the array ok, with 2 arguments crashes
  {
    if (lua_isnumber(L, -1))
    {
      llaArray[i] = lua_tonumber(L, -1);
      i++;
    }
    xyz->x = llaArray[0];
    xyz->y = llaArray[1];
    xyz->z = llaArray[2];
    lua_pop(L, 1);
  }
  return res;
}

【问题讨论】:

    标签: c++ arrays lua arguments lua-table


    【解决方案1】:

    堆栈索引-2 是 lua C 堆栈的倒数第二个元素。 lua C 函数的参数也在堆栈上。因此,当您获得两个参数时,您的堆栈为 <table>, <number>,然后您推送一个 nil 值,您的堆栈为 <table>, <number>, <nil>,-2 是数字。

    您需要对堆栈进行规范化,以使值处于您期望的位置。

    一般来说,一个好的策略是使用正数来指代 C 函数的参数,使用负数来指代您手动添加到堆栈中的内容。

    【讨论】:

    • 如何规范化它?我应该在lua_next 调用中添加参数数量吗?
    • 你要么在函数开始时从堆栈中删除任何额外的参数(使用lua_settop),要么在你想使用堆栈顶部的任何参数时lua_pushvalue(使用负数)索引)或者您使用正确的索引(相对于 lua_gettop 返回的内容或类似于我建议的策略)开始。
    • 访问参数时,使用正索引更安全。
    猜你喜欢
    • 2016-06-10
    • 2021-11-22
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多