Простой пример lua передачи таблицы в c / Stack Overflow

Я изо всех сил пытаюсь найти и понять, как передать таблицу с lua на c ++

Что я имею:

Lua File:

-- lua script for sending table data
io.write("lua table to send")
tableexample = {x = 1, y = 2, z = 100}
return tableexample

сторона c / c ++

L = lua_open();
luaL_openfile(L, "luafile");
... call the function...
luaLdofile(L, luafile);
int result;
result = lua_pcall(L,0, LUA_MULTRET,0);
if(result){
fprintf(stderr, "failed %s\n", lua_tostring(L,-1));

if(lua_istable(L,-1)){
lua_gettable(L,-1);
x = lua_tonumber(L,-2);
y = lua_tonumber(L,-3);
z = lua_tonumber(L,-4);
}
else
printf("fail");

результат возвращается с ошибкой «попытка вызвать табличное значение»

Я просмотрел много разных учебников / примеров, но не нашел простого учебника, в котором не было бы 100 других вещей, и я запутался

некоторые ссылки, которые похожи — но слишком сложны для того, что я ищу
Итерация по таблице Lua из C ++?

0

Решение

Ваше использование lua_gettable неправильно.

Посмотрите на Руководство Lua:

void lua_gettable (lua_State *L, int index);

Помещает в стек значение t[k], где t это значение на
данный индекс и k это значение в верхней части стека.

Эта функция извлекает ключ из стека (помещая полученное значение
на своем месте).

В вашем примере значение в верхней части стека — это сама таблица, поэтому вы делаете эквивалент tableexample[tableexample] уважать.

Самый короткий способ достичь того, что вы хотите, это использовать lua_getfield вместо этого, что позволяет получить доступ к элементам таблицы с помощью строковых ключей:

lua_getfield(L, -1, "x");

В качестве альтернативы сначала поместите значение Lua типа string в стек и используйте lua_gettable для поиска.

lua_pushliteral(L, "x");
lua_gettable(L, -2);

Не забудьте сохранить свой стек сбалансированным. Каждое значение, которое вы помещаете в стек, должно быть правильно отображено. Руководство Lua определяет, как каждый вызов API изменяет стек с помощью чисел в \[ \] скобки справа от названия каждой функции.

4

Другие решения


По вопросам рекламы [email protected]