gpt4 book ai didi

c - 嵌套的 lua_CFunction 调用

转载 作者:行者123 更新时间:2023-12-04 14:15:40 24 4
gpt4 key购买 nike

处理嵌套 lua_CFunction 调用的最佳方法是什么?假设我有两个这样的函数:

static int function2(lua_State *L) {
int i = luaL_checkint(L, 1);

/* do something */

return 1;
};

static int function1(lua_State *L) {
struct udata *u = luaL_checkudata(L, 1, UDATA_METATABLE);
int i = luaL_checkint(L, 2);

/* do something */

/* this does not work, first on call stack is udata, not int */
return function2(L);
};

上面的函数调用不起作用。一种选择是修改 function2() 以使用堆栈上的最后一个元素(索引 -1),但这不是一般的解决方案,因为 function2() 可能会被调用来自具有不同调用堆栈的不同地方。另一种方法是将 return function2(L); 替换为

lua_pushcfunction(L, function2);
lua_pushvalue(L, 2);
lua_call(L, 1, 1); /* need to know number of results */

我假设这为 function2() 提供了自己的调用堆栈,因此无需修改它。但是这个解决方案对于具有更多参数的函数来说似乎过于复杂,因为它需要在堆栈上复制所有参数。

tl;dr:从另一个内部调用 lua_CFunction 的推荐方法/好方法是什么?

最佳答案

function1 中,您期望堆栈底部是用户数据。当你直接调用function2时,LuaState并没有改变,因此底部仍然是用户数据。

通过确保整数位于索引 1,您可以从 function1 成功调用 function2

您可以通过调用 lua_insert(L, 1) 来完成此操作,这会将顶部(假设索引 2)移动到索引 1。

您也可以通过弹出所有值并将整数推回:

lua_pop(L, lua_gettop(L));
lua_pushnumber(L, i);
return function2(L);

关于c - 嵌套的 lua_CFunction 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26982913/

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