无法从Lua函数获取C函数返回值

时间:2014-09-18 15:01:22

标签: c lua

我试图通过Lua库获取C函数的返回值,但是失败了。 我的代码如下:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include <stdio.h>

static int testcmd(lua_State *L)
{
    lua_pushnumber(L, 0xBADF00D);
    return 1;
}

lua_State *initLua()
{
    lua_State *L = luaL_newstate();
    lua_gc(L, LUA_GCSTOP, 0);
    luaL_openlibs(L);
    lua_register(L, "testcmd", testcmd);
    lua_gc(L, LUA_GCRESTART, 0);
    return L;
}

int main(void)
{
    lua_State *L = initLua();
    int error = luaL_loadbuffer(L, "testcmd()", 9, "line");
    if (error) { printf("Error @ luaL_loadbuffer()\n"); return 0; }
    lua_call(L, lua_gettop(L) - 1, LUA_MULTRET);
    if (lua_gettop(L) > 0) {
        int i;
        for (i = 1; i <= lua_gettop(L); ++i) {
            printf("%d: %g\n", i, lua_isnumber(L, i) ? lua_tonumber(L, i) : 0.0);
        }
    } else {
        printf("No data in stack\n");
    }
    lua_close(L);

    return 0;
}

我希望在0xBADF00D之后L获得1个浮点值,大约为lua_call()。但是,实际结果为No data in stack

如何在testcmd()中将值推送到堆叠?

1 个答案:

答案 0 :(得分:2)

你已经告诉C函数在调用时将值返回到lua(这是什么推动堆栈上的值并返回1正在做什么)。

您尚未完成的工作是从您正在运行的lua chunk返回返回的值。

当您从lua调用该函数时(使用luaL_loadbuffer(L, "testcmd()", 9, "line");),您要运行的语句为testcmd(),它不会对返回值执行任何操作,因此它不会从那块。

return testcmd()是您需要运行的代码。

回想一下,使用luaL_loadbuffer / lua_pcall对,您不会执行testcmd的直接调用。相反,您正在执行调用testcmd的lua代码。