Tag: lua api

lua函数的警报消息

我有以下代码: lua_getglobal(L, “lgd”); lua_getfield(L, -1, “value_pos_x”); cr->value_pos_x = lua_tointeger(L, -1); if (!lua_isinteger(L, -1)) printf(“value_pos_x allows only numbers;”); lua_getfield(L, -2, “value_pos_y”); cr->value_pos_y = lua_tointeger(L, -1); if (!lua_isinteger(L, -1)) printf(“value_pos_y allows only numbers;”); lua_getfield(L, -3, “time”); cr->time = lua_tointeger(L, -1); if (!lua_isinteger(L, -1)) printf(“time allows only numbers;”); 代码完美无缺。 我想知道的问题是,是否可以只保留一条消息并且适用于每个函数,例如: lua_getglobal(L, “lgd”); lua_getfield(L, -1, “value_pos_x”); cr->value_pos_x = lua_tointeger(L, […]

Lua – 为什么C函数作为userdata返回?

我正在为我的引擎开发游戏脚本,并使用metatable将函数从表(存储自定义函数和播放器数据)重定向到userdata对象(这是我的Player类的主要实现),以便用户可以用self来指代两者。 这就是我在Player类中使用C#进行绑定的方法: state.NewTable(“Player”); // Create Player wrapper table state[“Player.data”] = this; // Bind Player.data to the Player class state.NewTable(“mt”); // Create temp table for metatable state.DoString(@”mt.__index = function(self,key) local k = self.data[key] if key == ‘data’ or not k then return rawget(self, key) elseif type(k) ~= ‘function’ then print(type(k)) print(k) return k else return function(…) […]

在C中获取Lua表大小

如何在C中获得Lua表的大小? static int lstage_build_polling_table (lua_State * L) { lua_settop(L, 1); luaL_checktype(L, 1, LUA_TTABLE); lua_objlen(L,1); int len = lua_tointeger(L,1); printf(“%d\n”,len); … } 我的Lua代码: local stages = {} stages[1] = stage1 stages[2] = stage2 stages[3] = stage3 lstage.buildpollingtable(stages) 它总是打印0。 我究竟做错了什么?

加载模块未定义符号时出错:luaL_setfuncs

我正在尝试创建一个从lua脚本调用的C模块。 我正在研究debian linux。 我正在使用mysql-proxy和lua 5.2。 我已创建(从教程中复制)一些要调用的示例函数。 加载器的定义如下: int luaopen_luacall(lua_State* l) { luaL_newlibtable(l, luacall); luaL_setfuncs(l, luacall, 0); return 1; } 要从lua调用它,我使用以下代码: luacall = require(“luacall”) local f = luacall.fun1() 我用这个命令编译了它: g++ -shared -Wl,-E,-soname,libluacall.so -o luacall.so luacall.c -fPIC -llua -ldl 当我尝试运行脚本时,我在require命令上收到以下错误: error loading module ‘luacall’ from file ‘/usr/lib/mysql-proxy/lua/luacall.so’: /usr/lib/mysql-proxy/lua/luacall.so: undefined symbol: luaL_setfuncs 我真的迷失了我做错的事。

使用C API的弱表和GC终结器

我试图通过使用C API将其存储在弱表中来为函数值创建GC终结器。 我开始在纯Lua 5.2中编写原型: local function myfinalizer() print ‘Called finalizer’ end function myfunc() print ‘Called myfunc’ end local sentinels = setmetatable({}, { __mode=’k’ }) sentinels[myfunc] = setmetatable({}, { __gc=myfinalizer }) myfunc() myfunc = nil collectgarbage ‘collect’ print ‘Closing Lua’ 结果输出: Called myfunc Called finalizer Closing Lua 原型似乎按预期工作。 以下是C版: #include #include #include “lua.h” #include “lualib.h” #include […]

如何从C API在自己的环境中执行不受信任的Lua文件

我想通过调用lua_setfenv()在自己的环境中执行不受信任的.lua文件,这样它就不会影响我的任何代码。 该function的文档虽然只解释了如何调用函数,而不是如何执行文件。 目前运行我使用的文件: int error = luaL_loadfile(mState, path.c_str()) || lua_pcall(mState, 0, 0, 0); 我是否必须使用lua_setfenv从C API调用“dofile”lua函数,还是有更优雅的方法呢?

使用Lua C API迭代表的表

我正在尝试迭代Lua中的表格并输出: 每个表的关键。 每个表中每个条目的键/值对。 这是代码: void print_table(lua_State *L) { lua_pushnil(L); while(lua_next(L, -2) != 0) { const char *key = lua_tostring(L, -2); if(lua_isstring(L, -1)) printf(“%s = %s”, key, lua_tostring(L, -1)); else if(lua_isnumber(L, -1)) printf(“%s = %d”, key, lua_tonumber(L, -1)); else if(lua_istable(L, -1)) { printf(“%s”, key); PrintTable(L); } lua_pop(L, 1); } } } 这是我正在尝试输出的一个表的示例: s = { p […]