доступ к вложенным таблицам от Lua до C для получения значений

Привет, я пытаюсь получить доступ к вложенной таблице, отправленной из Lua в C. Таблица:

arg =
{
  MagicNumber =  {MagicNumber, 0},    
  ProdNum   =  {ProdNum,    1}, 
  LetterR   =  {LetterR,      0xc}, 
  Revision  =  {Revision,    0xd},  
  Space1    =  {Space1,     0xe}, 
  MnfctrCode  =  {MnfctrCode,  0xf},  
  Hyphen1   =  {Hyphen1,      0x12},
  ZeroCode  =  {ZeroCode, 0x13},    
  Hyphen2   =  {Hyphen2,      0x15},
  MnfctrMnth  =  {MnfctrMnth,  0x16}, 
  MnfctrYear  =  {MnfctrYear,  0x18}, 
  SerialNum =  {SerialNum,  0x1a},
  Space2    =  {Space2,     0x1e},
  ChkSum    =  {ChkSum,      0x1f}, 
}

таблица внутри представляет собой целочисленные значения, а ключ в таблице представляет собой строку. Мой фрагмент кода выглядит следующим образом:

lua_pushnil(L);

while(lua_next(L, -2) != 0)
{
    field = lua_tostring(L, -2);
    printf("\n %d field = %s", i, field);
    wrData[i-1] = lua_tonumber(L,-1);
    printf("\n data = 0x%x", wrData[i-1]);
    lua_pop(L, -1);
    i++;
}

Я что-то упустил, потому что возвращаемое значение равно 0x0.


person SanR    schedule 29.12.2016    source источник
comment
lua_tonumber(L,-1) неверно, так как у вас есть таблица с индексом -1, а не число (это значения из пар ключ-значение из таблицы arg)   -  person Egor Skriptunoff    schedule 30.12.2016
comment
lua_pop(L, -1) неверно: для этого требуется количество слотов, а не их позиции.   -  person lhf    schedule 30.12.2016
comment
Спасибо за ответы, я получил ответ отсюда: stackoverflow .com/questions/27037854/lua-c-read-nested-tables   -  person SanR    schedule 30.12.2016


Ответы (1)


Измените эту функцию в соответствии с вашими потребностями и вызовите ее с таблицей на вершине стека.

   void luaAccess(lua_State * L)// call this function with the table on the top of the stack
    {
        lua_pushnil(L);
        while(lua_next(L, -2))
        {
            switch(lua_type(L, -2))
            {
                case LUA_TSTRING:
                    //deal with the outer table index here
                break;
                //...  
                // deal with aditional index types here
            }
            switch(lua_type(L, -1))
            {
                case LUA_TTABLE:
                    lua_pushnil(L);
                    while (lua_next)
                    {
                        switch(lua_type(L, -2))
                        {
                            case LUA_TNUMBER:
                                // deal with the inner table index here
                            break;
                            //...  
                            // deal with aditional index types here
                        }
                        switch(lua_type(L, -1))
                        {
                            case LUA_TSTRING:
                                //deal with strings
                            break;
                            case LUA_TNUMBER
                                //deal with numbers
                            break;
                        }
                        lua_pop(L, 1);
                    }
                //...  
                // deal with aditional index types here
                break
            }
        }
        lua_pop(L, 1);
    }
person Luiz Menezes    schedule 07.01.2017