c++ - 当函数有多个参数时读取表会返回错误

标签 c++ arrays lua arguments lua-table

我正在尝试读取我正在开发的库中 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 函数的参数,使用负数来引用手动添加到堆栈中的内容。

关于c++ - 当函数有多个参数时读取表会返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30622606/

相关文章:

c++ - 为什么动态数组比静态数组慢

javascript - 为什么这个简单的基于数组的事件发射器顺序敏感?

javascript - 如何从所有分片中获取 users.cache 并将它们放入一个集合中,就像 client.user.cache 返回的集合一样?

ios - 从数组中删除重复的项目并保留最后出现的项目 - iOS

scripting - 如何为多个实体共享/重用 Lua 脚本?

java - 在 LuaJava 中访问常量

c++ - 未找到在未命名命名空间内声明的函数的函数定义 - 如何解决? ( Visual Studio 2015)

c++ - 在可以创建彼此实例的不同类之间共享静态数据成员

python - 在 swig .i 文件中,如何解析基于 3rd 方 mfc 的 dll 的 ms windows vc++ typedef 类型?

c++ - luabind:如何通过引用将值从 C++ 传递到 lua 函数?