J'essaye de charger des tables de Lua au C++ mais j'ai du mal à le faire correctement. Je passe à travers la première itération très bien, mais au deuxième appel à lua_next il se bloque. Des idées?itération à travers une table Lua à partir de C++?
fichier Lua:
level = { 1, 2, 3, }
fichier C++ - D'abord, je l'ai fait:
lua_getglobal(L, "level");
for(lua_pushnil(L); lua_next(L, 1); lua_pop(L, -2))
{
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number
}
}
lua_pop(L, 1);
Alors j'ai essayé de la reference manual:
lua_getglobal(L, "level");
int t = 1;
lua_pushnil(L);
while(lua_next(L, t)) {
printf("%s - %s",
lua_typename(L, lua_type(L, -2)),
lua_typename(L, lua_type(L, -1)));
lua_pop(L, 1);
}
lua_pop(L, 1);
Et enfin ceci:
lua_getglobal(L, "level");
lua_pushnil(L);
lua_next(L, 1);
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number fine
}
lua_pop(L, 1);
lua_next(L, 1); //crashes
etc...
Naturellement, L est un lua_State * et je l'initialise et je l'analyse correctement.
Edit: En réponse à Jesse Beder réponse J'ai essayé ce code, avec un enregistreur, mais je ne peux toujours pas à travailler.
qui a donné cette sortie:
stack size: 0
-1 is a table
-1 is now nil
-2 is now table
pred: 1
loop stuff
num: 1
stack size: 3
-3 is now table
stack size: 2
-2 is now table
Tout ce que vous avez dit, Jesse, semble vrai. Mais il échoue toujours à aller à l'itération suivante.
Edit2: J'ai essayé de copier le code exact dans un nouveau projet, en sautant toutes les classes environnantes et des choses que je ne l'ai pas pris la peine d'inclure ici et là cela fonctionne. Mais ici, il ne le fait pas, et il survivra juste un appel le lua_next.
Édition3: Je l'ai réduit un peu plus loin maintenant. J'utilise hge comme moteur 2D. Je mets tout le code précédent dans le test de fonctionnement:
test(); //works
if(hge->System_Initiate())
{
test(); //fails
hge->System_Start();
}
Pour autant que je comprends HGE ne fait rien avec lua. Here est le code source d'un petit test que j'ai fait. La source pour hge 1.81 est here.
Éditer4: La taille de la question devient incontrôlable mais elle ne peut pas être prise en compte. C'est le plus petit code que j'ai pu réduire.
extern "C"
{
#include <lua/lua.h>
#include <lua/lualib.h>
#include <lua/lauxlib.h>
}
#include <hge\hge.h>
bool frame_func()
{
return true;
}
bool render_func()
{
return false;
}
void test()
{
lua_State *L = lua_open();
luaL_openlibs(L);
if(luaL_dofile(L, "levels.lua")) {
lua_pop(L, -1);
return;
}
lua_getglobal(L, "level");
lua_pushnil(L);
while(lua_next(L, -2)) {
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number
}
lua_pop(L, 1);
}
lua_pop(L, 1);
lua_close(L);
}
int main()
{
HGE *hge = hgeCreate(HGE_VERSION);
hge->System_SetState(HGE_FRAMEFUNC, frame_func);
hge->System_SetState(HGE_RENDERFUNC, render_func);
hge->System_SetState(HGE_WINDOWED, true);
hge->System_SetState(HGE_SCREENWIDTH, 800);
hge->System_SetState(HGE_SCREENHEIGHT, 600);
hge->System_SetState(HGE_SCREENBPP, 32);
//test(); //works
if(hge->System_Initiate())
{
test(); //fails
hge->System_Start();
}
hge->Release();
return 0;
}
Alors le deuxième appel à 'lua_next' se bloque? C'est bizarre ... avez-vous des informations de débogage sur le crash (comme où il se bloque exactement)? En outre, juste pour s'assurer que les choses fonctionnent correctement, vous devez enregistrer la clé à chaque étape (il doit également s'agir d'un nombre) et modifier cette réponse. –
J'ai ajouté la valeur de retour de lua_next. Je n'ai aucune information de débogage et je ne sais pas trop comment l'ajouter non plus ... – Jonas
Cette deuxième édition est un indice - jetez un coup d'œil à l'édition de ma réponse –