Lua C API: вставка элементов таблицы вызывает сбой утверждения отладки

Функция успешно возвращается, и я могу использовать значения из таблицы, но появляется сообщение об ошибке «Отладка не удалось», и это конец. Я знаю, что проблема с 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(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>

Скрипт выглядит так:

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

ПРОБЛЕМА:

int я = 1;

вывод:

A B C D !!! Утверждение отладки не выполнено !!!

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

int я = 0;

вывод:

B C D без ошибок ...


person deepspace    schedule 12.08.2013    source источник
comment
Если он находится в цикле for, это вина Lua API?   -  person Bartek Banachewicz    schedule 12.08.2013
comment
Да, это вина Lua API.   -  person deepspace    schedule 12.08.2013
comment
@deepspace Что значит он забывает последний элемент? То, как ваш цикл перебирает элементы узла не зависит от i. Вы имеете в виду, что элемент first отсутствует, потому что он вставлен в t[0] = e->GetText()?   -  person greatwolf    schedule 12.08.2013
comment
Я не знаю. Только представьте, что я меняю i на 0, и он работает, но не помещает первый элемент e- ›GetText () (const char *) в таблицу. Если для i установлено значение 1, это показывает, что отладка не выполнена, но все элементы, которые мне нужны, находятся в таблице. Не знаю почему. Функция работает, но программа останавливается. Я попытался использовать pushliteral вместо pushstring (не думаю, что это имеет значение), но компилятор не смог.   -  person deepspace    schedule 12.08.2013
comment
просто чтобы помочь с отладкой, можно ли заставить его вставлять фиктивную строку для всех элементов? например. что-то вроде lua_pushstring(L, "blah foobar"); и закомментируйте lua_pushstring(L, e->GetText());   -  person greatwolf    schedule 12.08.2013
comment
Во втором случае попробуйте итерацию с парами, вы должны увидеть все элементы. Утверждение отладки текста не выполнено, его нет в исходном коде Lua.   -  person Caladan    schedule 12.08.2013
comment
Я снова собрал библиотеку через несколько часов, и теперь ошибок нет! Я не знаю, что происходит. Теперь все работает нормально. Возможно, в IDE была ошибка. Я построил, когда перезапустил. Всем спасибо :) мир.   -  person deepspace    schedule 12.08.2013
comment
Предлагаю вам очистить тему, чтобы не запутать других.   -  person Caladan    schedule 12.08.2013
comment
Не печатать первый элемент, когда вы используете 0 и ожидается ipairs. ipairs, совпадающий с остальной частью lua, начинается с 1, поэтому ipairs просто не видит индекс / значение 0.   -  person Etan Reisner    schedule 12.08.2013


Ответы (1)


Вы уверены, что в вашем коде нет ошибки?

Я только что проверил это решение, и, похоже, оно работает, код печатает только что созданную таблицу:

#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);
}
person Caladan    schedule 12.08.2013
comment
Программа вылетает, когда я устанавливаю индекс на -3. Это на -2. Я не вижу здесь проблемы. - person deepspace; 12.08.2013
comment
Вы пытались отладить его, чтобы посмотреть, что такое стек вызовов и как выглядит стек lua? - person Caladan; 12.08.2013
comment
Да, я пробовал, и проблема в lua_rawseti (L, -3, i); Я сказал, что таблица находится на -2 (это следующий оператор, который нужно выполнить). - person deepspace; 12.08.2013
comment
Это безумие. Когда я устанавливаю переменную i на 0, она выглядит так, как это 0, 1, 2, 3, и не происходит сбоя (он забывает о последнем элементе), но когда он находится на 1, печатает все элементы, и утверждение не отображается. . - person deepspace; 12.08.2013
comment
Этот пример: lua-users.org/wiki/SimpleLuaApiExample показывает, что я должен начать с 1. Попробуйте инициализировать i var одним, и вы увидите. - person deepspace; 12.08.2013
comment
@deepspace пример ссылки начинается с единицы, потому что lua обычно начинает отсчет с 1, а не с 0, как в других языках. Что касается lua_rawseti, это то же самое, что t[n] = v в коде lua (без метаметодов). - person greatwolf; 12.08.2013
comment
Я знаю, что Lua начинается с 1, но я имею в виду, что эта программа не работает должным образом, когда я инициализирую i с помощью 1: При использовании lua_rawseti (L, -2,1) там Debug Assertion Failed. ; - примечание 1. Кажется, что функция работает, но эта неприятная ошибка появляется без всякой причины. - person deepspace; 12.08.2013
comment
Можете ли вы отследить, что вызывает это утверждение? Появляется сообщение: «Утверждение отладки не выполнено без какого-либо дополнительного сообщения?» Без номера строки, без имени файла? - person Caladan; 12.08.2013