当函数有多个参数时读取表返回错误
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函数的参数,而使用负数来引用你手动添加到堆栈中的东西。
相关文章:
- 从 cin 读取不会返回整个输入字符串
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 读取文件在第二次调用时返回INVALID_HANDLE
- 如何读取指针的值,因为这个指针是函数的返回?
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 无法从文件中读取 - ferror() 返回 1
- 串行读取()不会在没有数据接收的情况下返回值
- Java 套接字读取在第二次读取时返回奇怪字符
- 我想读取文本文件中的所有内容(但文本文件中只有一个双精度值),转换为双精度值并返回值
- 无法从串行端口读取.WaitCommEvent() 永远不会返回
- cudaMemcpy 在从设备读取到主机时返回 cudaErrorInvalidArgument,不清楚原因
- 尝试以随机字符(长读取)打印字符串返回结果
- CreateFile 在尝试打开目录进行读取时始终返回错误 5(访问被拒绝)
- 如何从函数读取返回值
- C++Curl,如何读取返回数据
- 为什么开始读取返回错误ENOMEM(_B)
- ASCII 和二进制 - 按原样显示,但读取返回垃圾
- 在c++中读取返回零
- 从文件中读取返回我没想到的结果,试图理解为什么
- 如何从子进程读取返回代码