2010-09-09 5 views
1

J'encadre Lua dans une application C++ en utilisant Lua5.1 et j'ai un problème étrange avec luaL_newstate().lual_newstate en dehors de la fonction principale

Cela fonctionne:

lua_State *L = NULL; 
int main() 
{ 
    L = luaL_newstate(); 
    return 0; 
} 

J'ai récemment restructuré mon code et a choisi de créer une fonction init comme ceci:

lua_State *L = NULL; 
void init_lua(lua_State *L) 
{ 
    L = luaL_newstate(); 
} 
int main() 
{ 
    init_lua(L); 
    return 0; 
} 

qui ne fonctionne pas. Pour une raison quelconque, luaL_newstate() renvoie toujours NULL dans cette situation. Mais, d'ajouter à la confusion, cela fonctionne:

lua_State *L = NULL; 
void init_lua(lua_State **L) 
{ 
    *L = luaL_newstate(); 
} 
int main() 
{ 
    init_lua(&L); 
    return 0; 
} 

Fonctionnellement, je ne vois pas de différence entre les deuxième et troisième exemples et pourtant le deuxième segfaults dès que je tente un appel Lua en utilisant L et la troisième fonctionne très bien. Que se passe-t-il ici?

+1

Avez-vous un livre C++? Que dit-il de transmettre des valeurs à des fonctions? – GManNickG

Répondre

5

Dans le second exemple, cette fonction:

void init_lua(lua_State *L) 
{ 
    L = luaL_newstate(); 
} 

Vous définissez L au retour de luaL_newstate(). L est un pointeur vers un lua_state. Cependant, vous modifiez uniquement la version des paramètres de L.

En vous troisième exemple:

void init_lua(lua_State **L) 
{ 
    *L = luaL_nwstate(); 
} 

Vous définissez la valeur pointée par L (qui est votre L défini globalement) au retour de luaL_newstate(). Vous modifiez donc la variable réelle transmise à la fonction. En résumé: lorsque vous passez une valeur dans le second exemple, la fonction ne peut pas changer la variable d'origine. Mais lorsque vous passez un POINTER à votre variable dans votre troisième, la fonction peut changer la valeur de cette variable en utilisant l'adresse que vous lui avez transmise.

+0

Merci. Je suis tellement content de ne pas avoir perdu la tête. – DynamiteReed

+0

Eh bien, j'espère juste que je l'ai bien expliqué. –

Questions connexes