2015-06-17 5 views
4

Я пробовал много альтернатив для этой простой вещи, но не смог заставить ее работать. Я хочу, чтобы пользователь, чтобы определить таблицу из Lua в 1-й шаг:Чтение таблицы Lua от C++

a={["something"]=10} -- key=something, value=10 

Затем, на втором этапе пользователь будет вызывать из Lua функции разработанный в C++:

b=afunction(a) -- afunction will be designed in C++ 

Код C++:

int lua_afunction(lua_State* L) 
{ 

    int nargs = lua_gettop(L); 
    if(nargs>1) throw "ERROR: Only 1 argument in the form of table must be supplied."; 
    int type = lua_type(L, 1); 
    if(type!=LUA_TTABLE) throw "ERROR: Argument must be a table"; 
    //Until here it works as expected 
    lua_pushnil(L); //does not work with or without this line 
    const char* key=lua_tostring(L,-2); 
    double val=lua_tonumber(L,-1); 

    return 0; 
} 

Как видно из кода lua_type(L,1) в нижней части стека сама таблица. Я принимал верх над таблицей, ключ будет располагаться и на вершине значения. Таким образом, высота стека равна 3 с idx = -1 значением, idx = -2 ключом. Однако кажется, что я не могу ни читать ключ («что-то»), ни значение (10). Любые идеи оценили.

+0

проверить этот ответ: http://stackoverflow.com/questions/6137684/iterate-through-lua-table/6142700#6142700 –

ответ

2

Необходимо позвонить по телефону lua_next(L,-2) после lua_pushnil(L).

Вам нужно lua_next, потому что, видимо, вы не знаете ключа в таблице. Таким образом, вы должны использовать протокол трассировки таблицы, который заключается в том, чтобы нажать таблицу, нажать nil, вызвать lua_next(L,-2) и получить ключ и значение в стеке. Это работает, потому что таблица содержит только одну пару.

Если бы вы знали ключ в таблице, вы можете просто назвали lua_gettable или lua_getfield, не вызывая lua_next и lua_pushnil.

+0

Он работает! Тем не менее, я не уверен, что понимаю логику «lua_pushnil (L)», а затем вызывает «lua_next (L, -2)». По-видимому, таблица, когда 'lua_pushnil (L)' называется, остается там, где она (дно стека), и теперь у нас есть нулевой элемент, поэтому высота стека равна 2. Что делает 'lua_next'? – macroland

+0

Хорошо! понял. http://www.lua.org/manual/5.1/manual.html – macroland

Смежные вопросы