Lua: 在回调函数中使用getglobal
2016-10-7 8:46:56
收藏:0
阅读:246
评论:1
我正在尝试理解 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);
}
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

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