当函数有很多参数 return 时读取 table 出错
Reading a table when function has many argument return an error
我正在尝试读取我正在开发的库中 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 函数的参数,使用负数来指代您手动添加到堆栈的内容。
我正在尝试读取我正在开发的库中 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 函数的参数,使用负数来指代您手动添加到堆栈的内容。