2010-02-08 6 views
5

Comment passer une table de longueur inconnue de Lua dans une fonction C++ liée?Comment passer une table de Lua en C++?

Je veux être en mesure d'appeler la fonction Lua comme ceci:

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

et copier le contenu de la table dans un tableau (de préférence vecteur STL)?

+0

Êtes-vous simplement en utilisant le c-api Lua cru? Ou utilisez-vous l'une des nombreuses bibliothèques ToLua, lua ++, luabind? Les détails de la réponse dépendront de votre approche –

Répondre

3

Si vous utilisez LuaBind, c'est aussi simple qu'un appel enregistré. En ce qui concerne le roulement de votre propre, vous devez jeter un oeil à la fonction lua_next.

Fondamentalement, le code est le suivant:

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

L'utilisation de lua_next() est-elle correcte? Pour la fonction next(), le manuel de Lua indique "L'ordre dans lequel les indices sont énumérés n'est pas spécifié, même pour les indices numériques". Si cela est également vrai pour lua_next(), vous risquez de ne pas obtenir les valeurs dans l'ordre attendu. – mkluwe

-1

Vous pouvez également utiliser lua_objlen:

Renvoie la "longueur" de la valeur à l'indice acceptable donné: pour les chaînes, ce est la longueur de la chaîne ; pour les tables, il s'agit du résultat de l'opérateur de longueur ('#'); pour userdata, il s'agit de la taille du bloc de mémoire affecté aux données utilisateur ; pour d'autres valeurs, il est 0.

+0

Q: Comment passer une table de lua en C++? R: Utilisez 'lua_objlen'. – cubuspl42

2

Ce serait ma tentative (sans vérification d'erreur):

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