Тема: Lua и С++, ошибка
Здравствуйте!
Внутри подключаемой из Lua dll есть вот такая функция на C:
static int forLua_OnQuote(lua_State *L)
{
const char *argClass = NULL;
size_t argClassLen = 0;
const char *argSec = NULL;
size_t argSecLen = 0;
argClass = luaL_checklstring(L, 1, &argClassLen);
argSec = luaL_checklstring(L, 2, &argSecLen);
stack ss;
if( strcmp(argClass,"SPBFUT")==0 && strcmp(argSec,"RIM4")==0)
{
lua_settop(L,0);
lua_getfield (L, LUA_GLOBALSINDEX, "getQuoteLevel2");
lua_pushstring (L, argClass);
lua_pushstring (L, argSec);
int r = lua_pcall (L, 2 /* num args */, 1 /* num res */, 0);
if (r==0)
{
//успешный вызов, в стеке таблица
size_t argLeng = 0;
byte cc=0;
lua_pushnil(L);
while (lua_next(L, -2) != 0)
{
std::string k1 = luaL_checklstring(L, -2, &argLeng); // здесь лежит ключ (bid_count, offer_count, bid, offer)
switch (cc) {
case 0: ss.bid_count = atoi( ((std::string)luaL_checklstring(L, -1, &argLeng)).c_str() ); break;
case 1: ss.offer_count = atoi( ((std::string)luaL_checklstring(L, -1, &argLeng)).c_str() ); break;
case 2: // здесь идет обработка вложенной таблицы bid
lua_pushnil(L);
while (lua_next(L, -2) != 0) //!!!!!!! при второй итерации здесь возникает ошибка:
{ //!!!!!!! lua invalid key to 'next'
std::string k2 = luaL_checklstring(L, -2, &argLeng); // здесь лежит ключ, по -1 лежит значение
lua_pop(L, 1);
}
lua_pop(L, 1);
break;
case 3: // здесь должна быть обработка вложенной таблицы offer
break;
}
lua_pop(L, 1);
cc++;
}
lua_pop(L, 1);
}
else
{
//какая-то ошибка при вызове getQuoteLevel2
MsgToQuik(L, (char *)lua_tostring (L, -1));
}
}
return(1);
}
В Lua она регистрируется как коллбэк OnQuote. При попытке пройтись по массиву bid на второй итерации возникает ошибка(lua invalid key to 'next'), хотя первую пару ключ/значение цикл видит верно. Ключ: "1", значение: "таблица". Если погрузиться ниже, в bid[1], то видит оба ключа и оба значения. Если не погружаться во вложенные таблицы, а пройтись только по первой, в которой всего 4 значения, то тоже все хорошо. В чем я тут неправ, откуда ошибка? Подскажите пожалуйста.