C++ Lua C API:插入表元素导致调试断言失败
函数成功返回,我可以使用表中的值,但出现错误“Debug Assertion Failed”,到此结束。我知道assert的问题在for循环中,但不知道如何解决。提前谢谢C++ Lua C API:插入表元素导致调试断言失败,c++,lua,lua-api,C++,Lua,Lua Api,函数成功返回,我可以使用表中的值,但出现错误“Debug Assertion Failed”,到此结束。我知道assert的问题在for循环中,但不知道如何解决。提前谢谢 static int l_xmlNodeGetValues(lua_State *L) { int iDocID = luaL_checkint(L, 1); const char *pszNodeName = luaL_checkstring(L, 2); CConfig *file = docs.at(iDo
static int l_xmlNodeGetValues(lua_State *L)
{
int iDocID = luaL_checkint(L, 1);
const char *pszNodeName = luaL_checkstring(L, 2);
CConfig *file = docs.at(iDocID);
int i = 1;
lua_newtable(L);
for( TiXmlElement *e = file->GetRootElement()->FirstChildElement(pszNodeName);
e; e = e->NextSiblingElement(pszNodeName) )
{
lua_pushstring(L, e->GetText());
lua_rawseti(L,-2,i);
i++;
}
return 1;
}
编辑:当我设置int I时;在0上它工作,但忘记了最后一个元素。如果i==1,为什么不呢
当lua_rawseti(L,-2,i)时,断言失败和i==1
由于没有解决我的问题的解决方案,我将尝试描述它的作用以及这两种情况下的输出。我只想从xml文件中的指定节点获取所有值:
<root>
<node>A</node>
<node>B</node>
<node>C</node>
<node>D</node>
</root>
问题:
int i=1
输出:
A
B
C
D
!!!调试断言失败
------------------------------------------------------
int i=0
输出:
B
C
D
没有错误
你确定你的代码中没有错误吗 我刚刚检查了这个解决方案,它似乎工作了,代码打印了它刚刚创建的表:
#include <lua.hpp>
#include <stdio.h>
static int fun(lua_State * L)
{
int i;
lua_newtable(L);
for(i = 0; i < 10; i++ )
{
lua_pushstring(L, "A");
lua_rawseti(L,-2,i);
}
lua_setglobal(L, "t");
return 1;
}
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
fun(L);
if (luaL_dostring(L, "for k,v in ipairs(t) do print(k,v); end;\n"))
printf("%s\n",luaL_checkstring(L, -1));
lua_close(L);
}
#包括
#包括
静态int fun(lua_State*L)
{
int i;
新表(L);
对于(i=0;i<10;i++)
{
lua_推进管柱(L,“A”);
卢厄·罗塞蒂(L,-2,i);
}
lua_setglobal(L,“t”);
返回1;
}
int main()
{
lua_State*L=luaL_newstate();
luaL_openlibs(L);
乐趣(L);
if(luaL_dostring(L,“对于ipairs(t)中的k,v,不打印(k,v);结束;\n”))
printf(“%s\n”,luaL_校验字符串(L,-1));
卢厄关闭(L);
}
如果它在for
循环中,是Lua API的错误吗?@deepspace你说它忘记最后一个元素是什么意思?循环在节点元素上迭代的方式不依赖于i。您的意思是第一个元素似乎丢失了,因为它被插入到t[0]=e->GetText()
?为了帮助调试,可以让它为所有元素推送一个伪字符串吗?例如,类似于lua_pushstring(L,“blah foobar”)代码>并注释掉lua_pushstring(L,e->GetText())在第二种情况下,尝试成对迭代,您应该可以看到所有元素。Lua的源代码中没有文本“debug assertion failed”。我建议您清理该主题,以免混淆其他主题。当我将索引设置为-3时,程序崩溃。在-2频道。我没有看到这里的问题。您是否尝试调试它以查看调用堆栈是什么以及lua堆栈是什么样子的?是的,我尝试过,问题在于lua_rawseti(L,-3,I);我说表在-2上。(这是下一个要执行的语句)这太疯狂了。当我将I变量设置为0时,它会像0、1、2、3那样运行,不会崩溃(它会忘记最后一个元素),但当它设置为1时,会打印所有元素,并显示断言失败。此示例:显示我应该从1开始。尝试用1初始化i var,您将看到。
#include <lua.hpp>
#include <stdio.h>
static int fun(lua_State * L)
{
int i;
lua_newtable(L);
for(i = 0; i < 10; i++ )
{
lua_pushstring(L, "A");
lua_rawseti(L,-2,i);
}
lua_setglobal(L, "t");
return 1;
}
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
fun(L);
if (luaL_dostring(L, "for k,v in ipairs(t) do print(k,v); end;\n"))
printf("%s\n",luaL_checkstring(L, -1));
lua_close(L);
}