2013-03-14 1 views
1

Je suis actuellement en utilisant le code suivant pour obtenir une valeur d'une table (cstring = const char *):Get entrée de table de lua de C via entier clé

template<> 
cstring luaTable::get(cstring name) { 
    prep_get(name); // puts table[name] at -1 in stack 
    cstring result; 
    if(!lua_isstring(L, -1)) { 
     report(name, "is not a string"); 
     result = ""; 
    } 
    else { 
      result = lua_tostring(L, -1);   
    } 
    lua_pop(L, 1); 
    return result; 
} 
void luaTable::prep_get(cstring name) { 
    lua_pushstring(L, name); // name at -1, table at -2 
    lua_gettable(L, -2); 
    // table[name] is now at position -1 in stack 
} 

Cela fonctionne parfaitement pour les tables de forme table = {a=10, b=2}. Comment puis-je le modifier pour obtenir des valeurs de tables sans clés telles que table = {10, 2}?

Je suis sûr qu'il me manque quelque chose de simple mais n'arrive pas à trouver la réponse.

Merci à l'avance, Ben

Edit: ajouté quelques pops

Répondre

1

Ok désolé de répondre à ma propre question si tôt - mais un éclair rapide de plomb d'inspiration pour:

void luaTable::prep_get(cstring name) { 
    lua_pushstring(L, name); // name string at -1 
    if(lua_isnumber(L, -1)) { // call prep_get("i") for ith element etc 
     int key = lua_tonumber(L, -1); 
     lua_pop(L, 1); // remove the name string from -1 
     lua_pushnumber(L, key); // push name number to -1 
    } 
    lua_gettable(L, -2); 
    // result is now at position -1 in stack 
} 

qui fonctionne comme souhaité.

0

@ user1483596 Je ne pense pas que cette solution fonctionnerait. lua_isnumber ne retournera vrai que si la valeur est de type number, et vous venez de pousser une chaîne, donc elle retournera toujours false.

Au lieu de cela, essayer quelque chose comme ceci:

void luaTable::prep_get(cstring name) { 
    int num = strtol(name, 0, 0); 
    if (num > 0) { 
     lua_pushnumber(L, num); 
    } else { 
     lua_pushstring(L, name); 
    } 
    lua_gettable(L, -2); 
} 

Gardez à l'esprit qu'il ne traitera pas un cas particulier. Dans Lua, un [1] et un ["1"] sont différents. Si vous utilisez cette fonction, vous traiterez toujours les nombres comme des indices de tableau, même s'ils ne le sont pas.

Si vous souhaitez différencier les deux cas, vous pouvez surcharger prep_get et prendre un nombre.

+0

À partir de certains documents: [lua_isnumber] Renvoie 1 si la valeur à l'index acceptable donné est un nombre ou une chaîne convertible en un nombre et 0 sinon. La fonction modifiée fonctionne bien (appel par exemple 'get (" 1 ")'). – user1483596

+0

Vous avez raison. Je vois ça maintenant (il utilise strtod en interne). – sergio