gpt4 book ai didi

c - Lua: getglobal 内部回调

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:56 24 4
gpt4 key购买 nike

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

最佳答案

3.14_VERSION 已经被压入堆栈,所以为 var 调用 lua_getglobal 它的索引将是 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);

关于c - Lua: getglobal 内部回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39913142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com