1

Function returns successfully and I can use values from the table but the error "Debug Assertion Failed" shows up and it's the end. I know that the problem with assert is in the for loop but don't exactly know how to fix that. Thanks in advance.

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;
}

EDIT: When I set int i; on 0 it works but forgets about last element. Why it doesn't if i == 1 ?

The assertion failed shows up when lua_rawseti(L,-2,i); and i == 1

Since there is no solution which solves my problem I'll try to describe what it does and what's the output in these 2 cases. I simply want to get all values from specified node in xml file:

<root>
    <node>A</node>
    <node>B</node>
    <node>C</node>
    <node>D</node>
</root>

The script looks like that:

xmlfile = xmlOpenFile( "myfile.xml", "root" );
if ( xmlfile ) then
    for _, v in ipairs( xmlNodeGetValues( xmlfile, "node" ) ) do
        print( v );
    end
end

PROBLEM:

int i = 1;

output:

A B C D !!!debug assertion failed!!!

------------------------------------------------------

int i = 0;

output:

B C D no errors...

9
  • If it's in the for loop, is it the fault of Lua API? Commented Aug 12, 2013 at 14:57
  • 1
    @deepspace What do you mean it forgets the last element? The way your loop iterates over the node elements does not depend on i. Do you mean the first element appears to be missing because it's inserted at t[0] = e->GetText()? Commented Aug 12, 2013 at 17:59
  • 1
    just to help with debugging, can you have it push a dummy string for all elements? eg. something like lua_pushstring(L, "blah foobar"); and comment out lua_pushstring(L, e->GetText()); Commented Aug 12, 2013 at 18:47
  • 1
    In the second case try iterating with pairs, you should see all the elements. The text "debug assertion failed" is not present in Lua's source code. Commented Aug 12, 2013 at 18:59
  • 1
    I suggest you clean up the topic not to confuse others. Commented Aug 12, 2013 at 19:08

1 Answer 1

2

Are you sure there's no error in your code?

I just checked this solution and it seems to work, the code prints the table it just created:

#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);
}
Sign up to request clarification or add additional context in comments.

8 Comments

Program crashes when I set the index on -3. It's on -2. I don't see the problem here.
Did you try to debug it to see what's the call stack and how does the lua stack look like?
Yes I tried and the problem is in the lua_rawseti(L,-3,i); I said that the table is on -2.(This is the next statement to execute)
That's crazy. When I set i variable on 0 it goes like that 0, 1, 2 ,3 and there's not crash(it forgets about last element) but when it's on 1, prints all elements and assertion failed shows up.
This example: lua-users.org/wiki/SimpleLuaApiExample shows that i should start with 1. Try to initialize i var with one and you'll see.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.