Как передать таблицу из Lua в C++?

Как мне передать таблицу неизвестной длины из Lua в связанную функцию C++?

Я хочу иметь возможность вызывать функцию Lua следующим образом:

call_C_Func({1,1,2,3,5,8,13,21})

И скопировать содержимое таблицы в массив (желательно вектор STL)?


person GameFreak    schedule 08.02.2010    source источник
comment
Вы просто используете сырой Lua c-api? Или вы используете одну из многих библиотек ToLua, lua++, luabind? Детали ответа будут зависеть от вашего подхода   -  person Andrew Walker    schedule 08.02.2010


Ответы (3)


Если вы используете LuaBind, это так же просто, как один зарегистрированный вызов. Что касается свертывания собственных, вам нужно взглянуть на функцию lua_next.

В основном код выглядит следующим образом:

lua_pushnil(state); // first key
index = lua_gettop(state);
while ( lua_next(state,index) ) { // traverse keys
  something = lua_tosomething(state,-1); // tonumber for example
  results.push_back(something);
  lua_pop(state,1); // stack restore
}
person Kornel Kisielewicz    schedule 08.02.2010
comment
Правильно ли используется lua_next()? Для функции next() в руководстве Lua указано, что порядок перечисления индексов не указан, даже для числовых индексов. Если это верно и для lua_next(), вы можете не получить значения в ожидаемом порядке. - person mkluwe; 12.02.2010

Это будет моя попытка (без проверки ошибок):

int lua_test( lua_State *L ) {
    std::vector< int > v;
    const int len = lua_objlen( L, -1 );
    for ( int i = 1; i <= len; ++i ) {
        lua_pushinteger( L, i );
        lua_gettable( L, -2 );
        v.push_back( lua_tointeger( L, -1 ) );
        lua_pop( L, 1 );
    }
    for ( int i = 0; i < len; ++i ) {
        std::cout << v[ i ] << std::endl;
    }
    return 0;
}
person mkluwe    schedule 12.02.2010

Вы также можете использовать lua_objlen:

Возвращает «длину» значения по заданному допустимому индексу: для строк это длина строки; для таблиц это результат оператора длины ('#'); для пользовательских данных это размер блока памяти, выделенного под пользовательские данные; для других значений это 0.

person uroc    schedule 08.02.2010
comment
В: Как передать таблицу из lua в C++? О: Используйте lua_objlen. - person cubuspl42; 25.06.2014