我已经注册了一个函数,它创建了一个由C ++和lua使用的lightuserdata。当我使用简单变量,整数和字符串进行测试时,该部分工作正常。我可以在lua中创建我的lightuserdata,当它是字符串和整数时没有错误。但是当我尝试使用表格时会变得更复杂
std::string aString = lua_tostring(lua,-4);
第一个参数是正确的,因为它应该是一个字符串
if (lua_type(lua,-3 == LUA_TTABLE)) //is true so i know it recognizes it as a table
{
auto t = lua_gettable(lua, -3);
size_t tableLen = lua_rawlen(lua, -3); // also gives me the correct size
lua_settop(lua, 1); //this discards the rest right? which i don't want.
//luaL_checktype(lua, 1, LUA_TTABLE); //using this crashes the application expecting
// table but getting string
lua_getfield(lua, 1, "a");
lua_getfield(lua, 1, "b");
lua_getfield(lua, 1, "c");
lua_getfield(lua, 1, "d");
lua_getfield(lua, 1, "e");
std::cout << lua_gettop(lua) << std::endl; //after using the getfields i get the new table size
//correctly (i assume, it turns 1 more value than expected, i think it's the table itself.
//int a = luaL_checkinteger(lua, -5); //these don't work as they expect numbers but get nil
//int b = luaL_checkinteger(lua, -4);
//int c = luaL_checkinteger(lua, -3);
//int d = luaL_checkinteger(lua, -2);
//int e = luaL_checkinteger(lua, -1);
std::cout << lua_tointeger(lua, -2) << std::endl; //returns always 0
}
试图忽略该表并获得堆栈的其余部分会给我一个0x000000的违规错误,虽然第3个值正确调试,因为它应该是第4个是空的,即使它正确传递,如果我不使用表。
我正在尝试做什么可能这样做?
任何对正确方向的评论都将受到赞赏。另外,如果我不知道表中键的名称,我该怎么用?
if(lua_type(lua,-3 == LUA_TTABLE))//是真的所以我知道它将它识别为一个表
这里有大错误,或者您没有发布实际代码。
你没有检查索引-3下的值的类型,你问的是索引false
下的值的类型,因为-3 == LUA_TTABLE
显然是false
。
无论在“检查”之后发生什么崩溃 - 都是这个错误的结果。它将识别任何不是nil
的表。