我试图通过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()
中将值推送到堆叠?
答案 0 :(得分:2)
你已经告诉C函数在调用时将值返回到lua(这是什么推动堆栈上的值并返回1正在做什么)。
您尚未完成的工作是从您正在运行的lua chunk返回返回的值。
当您从lua调用该函数时(使用luaL_loadbuffer(L, "testcmd()", 9, "line");
),您要运行的语句为testcmd()
,它不会对返回值执行任何操作,因此它不会从那块。
return testcmd()
是您需要运行的代码。
回想一下,使用luaL_loadbuffer
/ lua_pcall
对,您不会执行testcmd
的直接调用。相反,您正在执行调用testcmd
的lua代码。