我正在尝试了解Lua-C-API。为此,我编写了一个简单的回调函数,它试图获取一个全局变量,打印其参数,并推送两个返回值。我保存了我想要以test.lua
运行的Lua代码。这很简单,读取
var = 134
local n,s = callback(3.14, _VERSION)
print(n,s)
预期输出将是
global var = 134.000000
arg 1 = 3.14
arg 2 = Lua 5.2
123.456 Hello
然而,实际输出是
global var = 3.140000
arg 1 = 3.14
arg 2 = Lua 5.2
arg 3 = 134
123.456 Hello
这清楚地表明我以不明白的方式搞乱堆栈。下面是我的可编译C代码示例。编译使用
gcc -Wall -Wextra -pedantic -std=c99 test.c -llua
然后使用
运行示例Lua文件test.lua
./a.out test.lua
你能帮助我正确堆叠吗?
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdio.h>
#include <math.h>
static int l_callback(lua_State* L)
{
lua_getglobal(L, "var");
double var = NAN;
if (lua_isnumber(L, 1))
var = lua_tonumber(L, 1);
printf("global var = %f\n", var);
int args = lua_gettop(L);
for (int n = 1; n <= args; ++n)
printf("arg %d = %s\n", n, lua_tostring(L, n));
lua_pushnumber(L, 123.456);
lua_pushstring(L, "Hello");
return 2;
}
int main(int argc, char** argv)
{
if (argc <= 1)
{
fprintf(stderr, "Usage: %s <lua file>\n", argv[0]);
return 1;
}
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "callback", l_callback);
if (luaL_dofile(L, argv[1]) != LUA_OK)
{
const char* message = lua_tostring(L, -1);
puts(message);
lua_pop(L, 1);
}
lua_close(L);
}
答案 0 :(得分:2)
3.14
和_VERSION
已被推入堆叠,因此调用lua_getglobal
var
的索引将为3
。
您可以使用置换索引调整代码,以授予将上次推送的var值的值弹出到堆栈中。
lua_getglobal(L, "var");
double var = NAN;
if (lua_isnumber(L, -1))
var = lua_tonumber(L, -1);
printf("global var = %f\n", var);