Lua: 在回调函数中使用getglobal

我正在尝试理解 Lua-C-API。为此,我编写了一个简单的回调函数,它试图获取一个全局变量,打印它的参数,并推送两个返回值。我将要运行的 Lua 代码保存为“test.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);
}
点赞
用户3436922
用户3436922

3.14_VERSION已经被推入堆栈,因此调用lua_getglobal函数来获取变量var的索引为3

您可以使用偏移索引调整代码,以便将最后一个推入堆栈的变量值弹出。

lua_getglobal(L, "var");
double var = NAN;
if (lua_isnumber(L, -1))
  var = lua_tonumber(L, -1);
printf("global var = %f\n", var);
2016-10-07 09:14:36