gpt4 book ai didi

lua - 如何从c函数回调lua函数

转载 作者:行者123 更新时间:2023-12-04 02:03:53 24 4
gpt4 key购买 nike

我有一个 C 函数 (A) test_callback接受一个指向函数(B)的指针作为参数,A 将“回调”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

现在,我想包装 test_callback以便可以从 lua 调用它们,假设名称为 lua_test_callback ;而且它的输入参数将是一个lua函数。我应该如何实现这个目标?
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 "

编辑:

This link提供一种存储回调函数供以后使用的方法。
//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

最佳答案

我不确定我是否理解你的问题,如果你问什么会 lua_test_callback看看C,它应该是这样的

int lua_test_callback(lua_State* lua)
{
if (lua_gettop(lua) == 1 && // make sure exactly one argument is passed
lua_isfunction(lua, -1)) // and that argument (which is on top of the stack) is a function
{
lua_pushnumber(lua, 3); // push first argument to the function
lua_pcall(lua, 1, 0, 0); // call a function with one argument and no return values
}
return 0; // no values are returned from this function
}

你不能只是包装 test_callback ,你需要完全不同的实现来调用 Lua 函数。

(编辑:按照尼克的建议将 lua_call 更改为 lua_pcall。为简洁起见,我仍然省略了任何错误处理)

关于lua - 如何从c函数回调lua函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2688040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com