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

叶佩森

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

当我用一个参数调用函数时

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

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

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

程序崩溃。

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

我该如何解决?

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函数的参数,而使用负数来引用您已手动添加到堆栈中的东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当仅显式返回一个参数时,Powershell函数将返回所有参数

来自分类Dev

接收错误:从for循环中的多个csv文件读取单独的表时,长度为0的参数

来自分类Dev

SQL错误:将表参数传递给表值函数时,“必须声明标量变量”

来自分类Dev

SQL错误:将表参数传递给表值函数时,“必须声明标量变量”

来自分类Dev

传递NULL参数时,通过表函数返回所有记录

来自分类Dev

调用具有多个参数的Web API get方法将返回404 not found错误

来自分类Dev

将平均值或“”返回到具有函数的单元格时出现#VALUE错误

来自分类Dev

如何将多个表传递给 VBA 函数并返回?

来自分类Dev

选择带有多个参数返回mysql语法错误

来自分类Dev

将参数传递给函数时在oracle中返回null?

来自分类Dev

具有date参数的PL / SQL函数返回错误的输出

来自分类Dev

如果函数中没有参数则返回错误

来自分类Dev

具有多个参数的__str__函数的继承错误

来自分类Dev

具有多个参数的__str__函数的继承错误

来自分类Dev

模板函数在编译时返回类型没有参数

来自分类Dev

使用具有多个参数的函数时出错

来自分类Dev

Postgres函数:返回多个表

来自分类Dev

Python:将方法作为函数参数传递时的属性错误

来自分类Dev

是否使用多个函数参数来在 C 错误实践中返回多个值?

来自分类Dev

具有返回表(udtf)和游标的DB2 sql函数将无法编译(错误:子句是互斥的)

来自分类Dev

有多个表时,为什么COUNT(*)将结果相乘?

来自分类Dev

当一个参数是函数的返回值时,调用pow()时发生链接器错误

来自分类Dev

更新从数据库读取的表时,sqlUpdate返回错误“更新中的[RODBC] exec失败”

来自分类Dev

返回除数函数涉及多个参数?

来自分类Dev

具有多个返回段的JD Edwards计算表的错误返回值是多少?

来自分类Dev

返回带有参数的函数的JavaScript函数

来自分类Dev

每当尝试将另一个表中的列作为别名联接时,出现“子查询返回多个行”错误?

来自分类Dev

如何避免将空参数传递给具有多个可选参数的函数?

来自分类Dev

如何避免将空参数传递给具有多个可选参数的函数?

Related 相关文章

  1. 1

    当仅显式返回一个参数时,Powershell函数将返回所有参数

  2. 2

    接收错误:从for循环中的多个csv文件读取单独的表时,长度为0的参数

  3. 3

    SQL错误:将表参数传递给表值函数时,“必须声明标量变量”

  4. 4

    SQL错误:将表参数传递给表值函数时,“必须声明标量变量”

  5. 5

    传递NULL参数时,通过表函数返回所有记录

  6. 6

    调用具有多个参数的Web API get方法将返回404 not found错误

  7. 7

    将平均值或“”返回到具有函数的单元格时出现#VALUE错误

  8. 8

    如何将多个表传递给 VBA 函数并返回?

  9. 9

    选择带有多个参数返回mysql语法错误

  10. 10

    将参数传递给函数时在oracle中返回null?

  11. 11

    具有date参数的PL / SQL函数返回错误的输出

  12. 12

    如果函数中没有参数则返回错误

  13. 13

    具有多个参数的__str__函数的继承错误

  14. 14

    具有多个参数的__str__函数的继承错误

  15. 15

    模板函数在编译时返回类型没有参数

  16. 16

    使用具有多个参数的函数时出错

  17. 17

    Postgres函数:返回多个表

  18. 18

    Python:将方法作为函数参数传递时的属性错误

  19. 19

    是否使用多个函数参数来在 C 错误实践中返回多个值?

  20. 20

    具有返回表(udtf)和游标的DB2 sql函数将无法编译(错误:子句是互斥的)

  21. 21

    有多个表时,为什么COUNT(*)将结果相乘?

  22. 22

    当一个参数是函数的返回值时,调用pow()时发生链接器错误

  23. 23

    更新从数据库读取的表时,sqlUpdate返回错误“更新中的[RODBC] exec失败”

  24. 24

    返回除数函数涉及多个参数?

  25. 25

    具有多个返回段的JD Edwards计算表的错误返回值是多少?

  26. 26

    返回带有参数的函数的JavaScript函数

  27. 27

    每当尝试将另一个表中的列作为别名联接时,出现“子查询返回多个行”错误?

  28. 28

    如何避免将空参数传递给具有多个可选参数的函数?

  29. 29

    如何避免将空参数传递给具有多个可选参数的函数?

热门标签

归档