Itération sur table de tables avec l’API Lua C

J’essaie de parcourir une table de tables dans Lua et de générer:

  • La clé de chaque table.
  • La paire clé / valeur de chaque entrée de chaque table.

Voici le code:

void print_table(lua_State *L) { lua_pushnil(L); while(lua_next(L, -2) != 0) { const char *key = lua_tossortingng(L, -2); if(lua_isssortingng(L, -1)) printf("%s = %s", key, lua_tossortingng(L, -1)); else if(lua_isnumber(L, -1)) printf("%s = %d", key, lua_tonumber(L, -1)); else if(lua_istable(L, -1)) { printf("%s", key); PrintTable(L); } lua_pop(L, 1); } } } 

Et voici un exemple de tableau que j’essaie de produire:

 s = { p = { n = "D", g = "1", }, d = { l = "N", p = "N", u = "O", po = 100, }, e = { { n = "B", l = "P", p = "P", u = "P", po = "P", pa = { v = "4", a = "U", f = { { name = "U", type = "U" }, { name = "A", type = "I" }, { name = "A", type = "I" }, { name = "P", type = "U" }, { name = "P", type = "U" }, { name = "P", type = "I" }, { name = "T", type = "U" }, { name = "D", type = "U" }, { name = "D", type = "I" }, { name = "S", type = "I" }, { name = "C", type = "U" }, { name = "G", type = "U" }, { name = "C", type = "F" }, { name = "C", type = "U" }, }, }, c = { v = "1", a = "", f = { { name = "B", type = "U" }, { name = "E", type = "F" }, }, }, }, }, } 

La fonction se bloque dans la ligne:

 while(lua_next(L, -2) != 0) 

en raison d’un index non valide. La ligne de script qui provoque le crash est la suivante:

 { name = "B", type = "U" }, 

Je dois admettre que je ne suis pas très familier avec la stack de Lua. J’ai essayé de chercher des réponses similaires et je n’ai pas pu en trouver. Quelqu’un sait ce que je fais mal?

Merci!

Version de travail ajoutée au cas où quelqu’un serait intéressé:

 void print_table(lua_State *L) { if ((lua_type(L, -2) == LUA_TSTRING)) printf("%s", lua_tossortingng(L, -2)); lua_pushnil(L); while(lua_next(L, -2) != 0) { if(lua_isssortingng(L, -1)) printf("%s = %s", lua_tossortingng(L, -2), lua_tossortingng(L, -1)); else if(lua_isnumber(L, -1)) printf("%s = %d", lua_tossortingng(L, -2), lua_tonumber(L, -1)); else if(lua_istable(L, -1)) { print_table(L); } lua_pop(L, 1); } } 

     f = { { name = "B", type = "U" }, { name = "E", type = "F" }, } 

    Est équivalent à:

     f = { [1] = { name = "B", type = "U" }, [2] = { name = "E", type = "F" }, } 

    Lorsque vous appelez lua_tossortingng sur la clé, Lua modifie l’index numérique en chaîne.

     const char *key = lua_tossortingng(L, -2); 

    lua_tossortingng utilise lua_tolssortingng et extrait du manuel :

    Si la valeur est un nombre, lua_tolssortingng modifie également la valeur réelle dans la stack en chaîne. (Cette modification confond lua_next lorsque lua_tolssortingng est appliqué aux clés lors du parcours d’une table.)

    Il est lua_type utiliser lua_type pour vérifier si la clé est vraiment une chaîne car lua_isssortingng ne vous dira que si la valeur de la stack peut être convertie en chaîne. Vous pouvez également pousser une copie de la clé et appeler lua_tossortingng sur la copie.