2013-04-03 2 views
0
We have a problem in our project,we use lua 5.1 as our scripting language. 

Mais lors de l'utilisation lua_pushnumber de passer trop de données de C++ pour Lua dans une fonction , pile de lua semble stackoverflow et cause autre partie du momery dans C++ a été écrit, et cela provoque un plantage de notre système lorsque le callback retourne en C++. Je veux savoir s'il y a quelques paramètres pour contrôler la taille de la taille de la pile lua .J'essaie de changer le paramètre LUA_MINSTACK qui a été défini dans lua.h, mais il semble ne pas fonctionner.J'essaie aussi d'utiliser lua_checkstack() pour éviter de pousser trop numéro à pile de Lua, mais il ne fonctionne pas aussiPuis-je redimensionner la taille maximale de la pile lors de l'utilisation lua_pushnumber

getNineScreenEntity(lua_State* L) 
{ 
    DWORD screenid = GET_LUA_VALUE(DWORD,1) 
    struct EntryCallback : public ScreenEntityCallBack 
    { 
     EntryCallback(){ } 
     bool exec(ScreenEntity * entity) 
     { 
      list.push_back(entity) 
      return true; 
     } 
     std::vector<ScreenEntity*> list; 
    }; 
    EntryCallback exec; 
    Screen* screen = ScreenManager::getScreenByID(screenid); 
    if (!screen) 
     return 0; 
    screen->execAllOfScreenEntity(exec); 
    int size = 0; 
    std::vector<ScreenEntity*>::iterator vit = exec.list.begin(); 
    for (; vit != exec.list.end(); ++vit) 
    { 
     lua_pushnumber(L,(*vit)->id); 
     ++size;  
    } 
    return size; 
} 

il semble que quand il y a trop d'entités dans un seul écran, notre programme se bloque.

+1

Combien d'objets essayez-vous de pousser sur la pile? Qu'est-ce qui ne fonctionne pas à propos de ce que vous faites? Quelles erreurs obtenez-vous? Montrez-nous du code qui reproduit le problème. –

+0

Tout d'abord, si vous voulez répondre, faites-le en modifiant votre question pour ajouter l'information manquante.Plus important encore, ce n'est pas * assez * d'informations. Je n'ai aucune idée de ce que fait cette fonction, qui l'a écrit, ou quoi que ce soit de similaire. Contrôlez-vous cette fonction? Qu'est-ce qui se passe là-bas? Donnez-nous [le * code entier * qui démontre le problème.] (Http://sscce.org) –

+0

Ok, merci pour vos conseils –

Répondre

0

Vous devriez vérifier la pile Lua à chaque fois avant d'y pénétrer.
La taille de la pile est 20 par défaut, elle devrait être agrandie manuellement si plus d'espace est requis.
Lua manual

2

Peut-être que cela vous aidera (de Lua 5.2 manuel)

int lua_checkstack (lua_State *L, int extra); 

« assure qu'il ya au moins « supplémentaires » emplacements de pile libre dans la pile. Elle retourne false si elle ne peut pas répondre à la demande , parce que cela ferait que la pile serait plus grande qu'une taille maximum fixe (typiquement au moins quelques milliers d'éléments) ou parce qu'elle ne peut pas allouer de mémoire pour la nouvelle taille de pile Cette fonction ne réduit jamais la pile, si la pile est déjà plus grande la nouvelle taille, il est laissé inchangé. "

Voici un exemple de fonction c ...

static int l_test1 (lua_State *L) { 
    int i; 
    printf("test1: on the way in"); stackDump(L); 
    int cnt = lua_tointeger(L, 1); 
    printf("push %d items onto stack\n", cnt); 
    printf("try to grow stack: %d\n", lua_checkstack(L, cnt)); 
    for (i=0; i<cnt; i++) { 
     lua_pushinteger(L, i);      /* loop -- push integer */   
    } 
    printf("test1: on the way out"); stackDump(L); 
    return 1; 
} 

Ce code:

  • décharges la pile sur le chemin dans la fonction. (1)
  • essaie d'étendre la taille de la pile pour avoir des emplacements libres 'cnt' (elle renvoie soit vrai, cela a fonctionné, soit faux, ce n'est pas le cas).
  • pousse le nombre d'entiers 'cnt' sur la pile
  • vide la pile en sortie.

$ lua demo.lua 
running stack test with 10 pushes 
test1: on the way in 
---1-- 
[1] 10 
----- 
push 10 items onto stack 
test1: on the way out 
---11-- 
[11] 9 
[10] 8 
[9] 7 
[8] 6 
[7] 5 
[6] 4 
[5] 3 
[4] 2 
[3] 1 
[2] 0 
[1] 10 
----- 
running stack test with 1000 pushes 
test1: on the way in 
---1-- 
[1] 1000 
----- 
push 1000 items onto stack 
try to grow stack: 1 
test1: on the way out 
---1001-- 
[1001] 999 
[1000] 998 
[999] 997 
[998] 996 
[997] 995 
[996] 994 
... 

Lorsque le code ci-dessus n'a pas l'appel lua_checkstack(), nous obtenons une erreur en essayant de pousser 1000 articles sur la pile.


running stack test with 1000 pushes 
test1: on the way in 
---1-- 
[1] 1000 
----- 
push 1000 items onto stack 
Segmentation fault (core dumped) 
$ 

(1) STACKDUMP() est similaire à ce qui apparaît dans PiL 3e éd. pour décharger le contenu de la pile.

Questions connexes