2010-02-08 12 views
5

¿Cómo pasaría una tabla de longitud desconocida de Lua a una función de C++ vinculada?¿Cómo paso una tabla de Lua a C++?

Quiero ser capaz de llamar a la función Lua como esto:

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

y copiar el contenido de la tabla en una matriz (preferiblemente STL vector)?

+0

simplemente estás utilizando la prima Lua API C? ¿O estás usando una de las muchas bibliotecas ToLua, lua ++, luabind? Los detalles de la respuesta dependerán de su enfoque –

Respuesta

3

Si usa LuaBind es tan simple como una llamada registrada. En cuanto a enrollar el suyo, necesita echar un vistazo a la función lua_next.

Básicamente, el código es el siguiente:

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 
} 
+2

¿Es correcto el uso de lua_next()? Para la función next(), el manual de Lua establece "No se especifica el orden en el que se enumeran los índices, incluso para los índices numéricos". Si esto también se aplica a lua_next(), es posible que no obtenga los valores en el orden esperado. – mkluwe

-1

También puede utilizar lua_objlen:

Devuelve la "longitud" del valor en el índice aceptable: para cuerdas, este es la cadena longitud; para las tablas, este es el resultado del operador de longitud ('#'); para datos de usuario , este es el tamaño del bloque de memoria asignado para los datos de usuario ; para otros valores, es 0.

+0

P: ¿Cómo paso una tabla de lua a C++? R: Use 'lua_objlen'. – cubuspl42

2

Esta sería mi intento (sin comprobación de errores):

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; 
} 
Cuestiones relacionadas