Créons un simple module C pour Lua 5.3 avec un int
global:Lua partagé exemple upvalue en C
static int l_test(lua_State *L){
int Global = lua_tointeger(L, lua_upvalueindex(1));
Global++;
lua_pushinteger(L, Global);
lua_pushvalue(L, -1);
lua_replace(L, lua_upvalueindex(1));
//lua_pushnumber(L, Global);
return 1;
}
static int l_anotherTest(lua_State *L){
int Global = lua_tointeger(L, lua_upvalueindex(1));
Global++;
Global++;
lua_pushinteger(L, Global);
lua_pushvalue(L, -1);
lua_replace(L, lua_upvalueindex(1));
//lua_pushnumber(L, Global);
return 1;
}
static const struct luaL_Reg testLib [] = {
{"test", l_test},
{"anotherTest", l_anotherTest},
{NULL, NULL}
};
int luaopen_testLib(lua_State *L){
luaL_newlibtable(L, testLib);
lua_pushinteger(L, 1);
luaL_setfuncs(L, testLib, 1) ;
return 1;
}
Cela fonctionne presque, mais quand j'appelle ces deux fonctions de Lua comme ceci:
local testLib = require "testLib"
print(testLib.test())
print(testLib.anotherTest())
La deuxième impression doit être 4
, mais elle affiche un 3
. Qu'est-ce que je fais encore de mal?
Pour initialiser le upvalue, vous devez pousser sa valeur initiale sur la pile juste avant d'appeler 'setfuncs'. Pour accéder à la valeur up de 'l_test', vous devez utiliser' lua_upvalueindex (1) 'pour obtenir le pseudo-index de la pile où se trouve cette valeur. –
Merci pour l'indice. J'ai mis à jour la question. Il y a encore quelque chose qui manque ici. Pouvez-vous m'aider? – user1511417
Utilisez la macro 'NULL' si vous voulez une constante de pointeur NULL. L'utilisation de l'entier '0' est un héritage trompeur. – Olaf