从C ++调用未知(按名称)lua函数

时间:2015-05-27 06:55:31

标签: c++ lua

这是我想要做的:

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。

来调用第一个参数(函数)

2 个答案:

答案 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留在堆栈而不是你的结果。首先弹出堆栈然后推送结果。