Nehmen wir ein einfaches C-Modul für Lua 5.3 mit einem globalen int
erstellen:Lua Shared aufzuwerten Beispiel in 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;
}
Diese fast funktioniert, aber wenn ich rufe diese beiden Funktion von Lua wie folgt aus:
local testLib = require "testLib"
print(testLib.test())
print(testLib.anotherTest())
Der zweite Druck sollte 4
sein, aber es wird ein 3
ausgedruckt. Was mache ich noch falsch?
die aufwerten zu initialisieren, sollten Sie seinen Anfangswert auf den Stapel schieben, kurz bevor 'setfuncs' aufrufen. Um auf den upvalue von 'l_test' zuzugreifen, sollten Sie' lua_upvalueindex (1) 'verwenden, um den Stack-Pseudoindex zu erhalten, in dem sich dieser Wert befindet. –
Danke für den Hinweis. Ich habe die Frage aktualisiert. Hier fehlt noch etwas. Kannst du mir helfen? – user1511417
Verwenden Sie das 'NULL'-Makro, wenn Sie eine Null-Zeiger-Konstante möchten. Die Verwendung der Ganzzahl "0" ist ein fehlgeleitetes Vermächtnis. – Olaf