私はLuaを初めて使ったので同じ質問がありました。私の意見では、満足のいく答えはなかったので、私はこの質問がいつまでも終わらないかもしれないが、私は1つを書くだろうと思った。うまくいけば、これはこの状況で他の人を助けるだろう。
main.cの
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
/* this keeps our Lua reference to the Lua function */
int callback_reference = 0;
/* this is called by Lua to register its function */
int lua_registerCallback(lua_State *L) {
/* store the reference to the Lua function in a variable to be used later */
callback_reference = luaL_ref(L, LUA_REGISTRYINDEX);
return 0;
}
/* calls our Lua callback function and resets the callback reference */
void call_callback(lua_State *L) {
/* push the callback onto the stack using the Lua reference we */
/* stored in the registry */
lua_rawgeti(L, LUA_REGISTRYINDEX, callback_reference);
/* duplicate the value on the stack */
/* NOTE: This is unnecessary, but it shows how you keep the */
/* callback for later */
lua_pushvalue(L, 1);
/* call the callback */
/* NOTE: This is using the one we duplicated with lua_pushvalue */
if (0 != lua_pcall(L, 0, 0, 0)) {
printf("Failed to call the callback!\n %s\n", lua_tostring(L, -1));
return;
}
/* get a new reference to the Lua function and store it again */
/* NOTE: This is only used in conjunction with the lua_pushvalue */
/* above and can be removed if you remove that */
callback_reference = luaL_ref(L, LUA_REGISTRYINDEX);
}
int main(void) {
/* set up Lua */
lua_State *L = lua_open();
luaL_openlibs(L);
/* register the lua_registerCallback function as */
/* "RegisterCallback" so it can be called by Lua */
lua_pushcfunction(L, lua_registerCallback);
lua_setglobal(L, "RegisterCallback");
/* run our Lua file */
if (0 != luaL_dofile(L, "callback.lua")) {
printf("Failed to load calback.lua!\n %s",
lua_tostring(L, -1));
lua_close(L);
return 1;
}
/* call the callback */
call_callback(L);
/* call the callback again if you want (because we restored */
/* the Lua function reference) */
call_callback(L);
/* remove the reference to the callback */
/* NOTE: This is also unnecessary if you didn't re-add the */
/* function to the registry */
luaL_unref(L, LUA_REGISTRYINDEX, callback_reference);
/* uninitialize Lua */
lua_close(L);
return 0;
}
callback.lua
function MyCallback()
print("Hello World!")
end
RegisterCallback(MyCallback)
答えにあなたのソリューションを抽出し、それを受け入れてください。 –