Lua:getglobal内部回调

时间:2016-10-07 08:46:56

标签: c lua

我正在尝试了解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);
}

1 个答案:

答案 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);