当函数有多个参数时读取表返回错误

Reading a table when function has many argument return an error

本文关键字:读取 返回 错误 参数 函数      更新时间:2023-10-16

我正在尝试在我正在开发的库中的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;
}

堆栈索引-2是lua C堆栈的倒数第二的元素。lua C函数的参数也在堆栈上。所以当你得到两个参数时,你的堆栈是<table>, <number>,然后你推入一个nil值,你的堆栈是<table>, <number>, <nil>, -2是数字。

你需要规范你的堆栈,使值在你期望的地方。

一般来说,一个好的策略是使用正数来引用C函数的参数,而使用负数来引用你手动添加到堆栈中的东西。