这是我想要做的:
1)用户定义了一个lua函数,我不知道名字。说它是:
function f(x) return 2*x; end
2)然后用户将从Lua调用一个函数(在步骤3中设计),如:
a=foo(f,3) --expecting a=6
3)foo的C ++函数是:
int lua_foo(lua_State *L)
{
int nargs = lua_gettop(L);
if(nargs<2) throw "ERROR: At least two arguments i) Function ii) number must be supplied";
int type = lua_type(L, 1);
if(type!=LUA_TFUNCTION) throw "ERROR: First argument must be a function";
double arg2=lua_tonumber(L,2);
lua_pushnumber(L,arg2);
lua_pcall(L, 1, 1, 0) ; //trying to call the function f
double result=lua_tonumber(L,-1); //expecting the result to be 6
lua_pushnumber(L,result);
lua_pop(L,nargs);
return 1;
}
在C ++代码中,我知道第一个参数是一个函数,第二个参数是一个数字。我试图用第二个参数(数字)作为其arg。
来调用第一个参数(函数)答案 0 :(得分:3)
如果功能设计如下:
/* avoid `lua_` (or `luaL_`) prefix for your own functions */
static int l_foo(lua_State *L)
{
/* `lauxlib.h` contains a lot of useful helper functions, e.g. for
* argument type checking: */
luaL_checktype(L, 1, LUA_TFUNCTION);
luaL_checknumber(L, 2);
/* discard any extra arguments to `foo`; ignoring extra arguments
* is customary for Lua functions */
lua_settop(L, 2);
/* the `lua_settop()` above ensures that the two topmost elements
* of the stack are the function `f` and its argument, so
* everything is set for the `lua_call()` */
lua_call(L, 1, 1);
/* return the topmost value on the Lua stack (the result); all
* other stack values are removed by Lua automatically (but in
* this case the result is the only value on the stack as the
* `lua_call()` popped the function and the argument, and pushed
* one result) */
return 1;
}
它按预期工作。
答案 1 :(得分:2)
通过reading the lua_call
manual,我觉得它是一个简单的堆栈顺序问题。堆栈应按顺序包含要按顺序调用的函数。
当您调用lua_pcall
时,堆栈包含该函数,foo
的参数和 foo
的参数你推。所以foo
调用的堆栈已经是正确的,你所要做的就是在没有任何其他堆栈推送的情况下调用lua_pcall
。
还有一个问题是你在之前推送结果你从堆栈弹出foo
的参数,这会将函数f
留在堆栈而不是你的结果。首先弹出堆栈然后推送结果。