wie man ein lua-callback-Funktion aus einer c-Funktion
Ich habe eine C-Funktion (A) test_callback
akzeptiert einen Zeiger auf eine Funktion(B) als parameter und Einen "Rückruf" B.
//typedef int(*data_callback_t)(int i);
int test_callback(data_callback_t f)
{
f(3);
}
int datacallback(int a )
{
printf("called back %d\n",a);
return 0;
}
//example
test_callback(datacallback); // print : called back 3
Nun, ich will wickeln test_callback
so, dass Sie aufgerufen werden kann, lua, nehme an, der name ist lua_test_callback
;und auch die input-parameter an, es wäre eine lua-Funktion. Wie sollte ich dieses Ziel erreichen?
function lua_datacallback (a )
print "hey , this is callback in lua" ..a
end
lua_test_callback(lua_datacallback) //expect to get "hey this is callback in lua 3 "
EDIT:
Dieser link bieten eine Möglichkeit zum speichern der callback-Funktion für die spätere Verwendung .
//save function for later use
callback_function = luaL_ref(L,LUA_REGISTRYINDEX);
//retrive function and call it
lua_rawgeti(L,LUA_REGISTRYINDEX,callback_function);
//push the parameters and call it
lua_pushnumber(L, 5); // push first argument to the function
lua_pcall(L, 1, 0, 0); // call a function with one argument and no return values
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, ob ich verstehe Ihre Frage, wenn Sie sich Fragen, was würde
lua_test_callback
look in C, es sollte so etwas wie diesesKönnen Sie nicht nur wickeln
test_callback
Sie brauchen völlig unterschiedliche Umsetzung der Aufruf von Lua-Funktionen.(edit: geändert
lua_call
zulua_pcall
wie vorgeschlagen von Nick. Ich noch weggelassen Fehlerbehandlung für die Kürze)Die bequeme Art zu tun, Anrufe an verschiedene Lua-Funktionen mit verschiedenen Signaturen:
A. Stellen Sie eine Klasse, die beibehalten wird, Lua Stand sicher und bieten eine einfache Schnittstelle. Nicht schreiben, anrufen, um Lua-Funktionen von Grund auf neu (mit jede Menge push/pop arbeiten und versichert) wieder und wieder - nur diese Klasse verwenden, interface. Dies ist sicher, schnell und bequem Ansatz.
B. Definieren Sie push und pop Methoden, um push/pop auf die Argumente/aus dem Lua-stack:
C. Definieren Funktionen aufrufen, Lua-Funktionen:
D. Set error handler (lua_pcall nennen diese Lua-Funktion wenn Fehler)