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("t
0 2024-04-10
编程技术问答社区
我如何通过lua C的API,在运行一段lua代码之前,为其设置环境表?
我的游戏引擎的接口是使用标记语言和LUA构建的,类似于HTML和JavaScript.因此,视觉元素将具有用于UI事件的处理程序,例如鼠标移动或单击,并且每次运行处理程序时,发动机都会检查是否已编译,如果没有,则会通过luaL_loadstring进行编译.可以通过元素重复或分配(this.onclick = that.onclick)共享手柄. 在运行它之前,如何设置一块LUA代码的环境?这个想法是要使可用于块的元素和特定于事件的数据,也可以链接到父元素元素的环境. lua 5.2更改删除lua_setfenv,所以我不确定如何如何做到这一点.功能 lua_load 允许指定环境,但似乎可以仅用于加载代码而不运行它. 解决方案 来自参考手册: 您可以使用负载(或LoadFile)在不同环境中加载块. (在C中,您必须加载块,然后更改其第一个Upvalue的值.) 设置UpValues是通过 lua_setupvalue .因此,首先加载代码,然后按新的环境,并
2 2024-04-09
编程技术问答社区
错误加载模块未定义的符号: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
0 2024-04-09
编程技术问答社区
Lua C API:处理和存储额外参数
创建性是我在项目中与lua绑定的C函数.它将实体类名称字符串作为第一个参数,以及任何数量的其他参数,这些参数应传递给所选实体的构造函数. 例如,如果创建性是正常的lua函数,我可以这样做: function CreateEntity( class, ... ) -- (choose a constructor function based on class) args = {...} -- (store args somewhere for whatever reason) TheConstructor( ... ) end 但是我该如何使用C LUA函数进行操作? 解决方案 c函数 lua_getTop 被传递给您的C功能.您必须从堆栈中读取全部内容,然后将它们存储在C数据结构中,或将它们放在LUA注册表中(请参阅注册表和#include #include #include
0 2024-04-09
编程技术问答社区
在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.我在做什么错? 解决方案 lua_objlen返回对象的长度,它不会在堆栈上推任何东西. 即使它确实在堆栈上推了一些东西,您的lua_tointeger呼叫都使用了表的索引,
0 2024-04-08
编程技术问答社区
如何在自己的环境中从C API中执行一个不受信任的Lua文件
我想通过调用该功能的文档仅说明了如何调用函数,而不是如何执行文件. 目前要运行我使用的文件: int error = luaL_loadfile(mState, path.c_str()) || lua_pcall(mState, 0, 0, 0); 我必须用lua_setfenv从C API称呼" dofile" lua函数,还是有一种更优雅的方法? 解决方案 请参阅Lua用户的 sandboxing 的讨论脚本安全的主题.这种事情有许多微妙的,不是那么微妙的问题.可以做到这一点,但是防止for i=1,1e39 do end之类的代码不仅需要限制用于沙箱的功能. 一般技术是为具有允许函数的白名单的沙箱创建功能环境.在某些情况下,该列表甚至可能是空的,但是让用户可以访问pairs(),例如,几乎肯定是无害的. Sandbox页面的系统功能列表通过其安全性分解为构建此类白名单的方便参考. 然后,您使用lua_setfenv()将功能环境应用于用户的脚本
0 2024-04-08
编程技术问答社区
使用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
2 2024-04-08
编程技术问答社区
lua c读取嵌套表
以下是我需要从C: 阅读的LUA表 listen = { { port = 1234, address = "192.168.1.1", userdata = "liunx" }, { port = 1235, address = "192.168.1.2", userdata = "liunx1" }, { port = 1236, address = "192.168.1.3", userdata = "liunx2" } } 以下是C代码: #include /* Always include this when calling Lua */ #include /* Always include this when calling Lua */ #include
0 2024-04-07
编程技术问答社区
用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)) { p
0 2024-04-07
编程技术问答社区
从嵌入lua的C代码中打印堆栈跟踪
如果我正确理解这一点,默认情况下,lua会在发生错误时称为debug库为" debug.traceback". 但是,当将lua嵌入c代码中时,例如此处的示例: 简单的lua api示例 我们仅在堆栈顶部有错误消息. 即. if (status) { /* If something went wrong, error message is at the top of */ /* the stack */ fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1)); /* I want to print a stacktrace here. How do I do that? */ exit(1); } 初次错误后如何打印C中的堆栈跟踪? 解决方案 lua默认情况下将在发生错误时称为debug库为" debug.traceback".
26 2023-09-28
编程技术问答社区
./lua/addtest.lua:9: 试图索引本地'testobj'(一个用户数据值)]]
test.exe调用addtest.lua并将lua_testobj设置为表格,addtest.lua调用testobj.dll, 但是testobj.dll无法获得" lua_testobj" 错误msg是 addtest.lua:9尝试索引本地'testobj'(一个用户数据值) test.exe L = luaL_newstate(); // link lua lib luaL_openlibs(L); // addLuaCPath( L, "./clib/?.dll" ); // lua_pushlightuserdata(L, (void*)g_TestObj.get()); // g_TestObj is a global vars lua_setfield(L, LUA_REGISTRYINDEX, "lua_testobj"); // int err = 0; err = luaL_loadfile( L, "./lua/addTest.lua"
18 2023-06-20
编程技术问答社区
如何使用C API创建嵌套的Lua表
我想创建一个 之类的表格 myTable = { [0] = { ["a"] = 4, ["b"] = 2 }, [1] = { ["a"] = 13, ["b"] = 37 } } 使用C API? 我当前的方法是 lua_createtable(L, 0, 2); int c = lua_gettop(L); lua_pushstring(L, "a"); lua_pushnumber(L, 4); lua_settable(L, c); lua_pushstring(L, "b"); lua_pushnumber(L, 2); lua_settable(L, c); 在循环中创建内表.以前,这个循环,我使用 lua_createtable(L, 2, 0); int outertable = lua_gettop(L); 为2个数字插槽创建外表. 但是如何将内表保存到外表? 解决方案 这是一个完整而最小的程序,演示了如
26 2023-03-15
编程技术问答社区
Lua-为什么C函数会以用户数据形式返回?
我正在为我的引擎进行游戏脚本编写,并且正在使用表从表(将自定义函数和播放器的数据存储)重定向函数(这是我的玩家类的主要实现),所以该用户可以使用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]
22 2023-03-15
编程技术问答社区
测试Lua数字是整数还是浮点数
在我的C ++程序中,我需要知道LUA变量是整数数字还是浮点数. C API提供lua_isnumber(),但此功能不能区分int/float/double. 到目前为止,我已经通过使用modf()来解决此问题: if (lua_isnumber(luaCtx, -1)) // int / unsigned int / float: { luaVarName = lua_tostring(luaCtx, -2); double n = static_cast(lua_tonumber(luaCtx, -1)); // Figure out if int or float: double fractPart, intPart; fractPart = modf(n, &intPart); if (fractPart != 0.0) { luaVarType = ScriptVar::T
270 2023-03-15
编程技术问答社区
Lua用户数据阵列的访问和方法
我正在用c用用户数据类型写作,以便在lua中使用.它具有一些数组型属性和各种方法.现在,如果您是这种类型的,我使用u:set(k,v) resp. u:get(k)访问数据,例如u:sort()作为方法.为此,我将__index设置为包含这些方法的表.现在,如果我想使用u[k] = v或u[k]访问数据,我需要将__newindex和__index设置为set resp get.但是,其他方法不再可访问... 在C中处理此问题的最佳方法是什么?我猜我需要在C中编写一个函数以注册为__index,并以某种方式处理它.也许检查键是否属于LUA方法表,如果是这样,请致电. 任何帮助/提示将不胜感激.我没有找到这样的例子,尽管这似乎是一件很自然的事情(对我来说) 编辑:在下面的答案中添加了我在LUA中的C版本.这或多或少是直接翻译,因此所有功劳都归 @Gilles-Gregoire. 以下C函数注册为__Index metAmethod. static int pe
58 2023-03-15
编程技术问答社区
使用句柄从.lua's调用lua函数?
我正在研究一个小型项目,试图将LUA与C ++集成在一起. 但是,我的问题如下: 我有多个lua脚本,让我们称它们为s1.lua s2.lua和s3.lua.这些都有以下功能:setVars()和executerEsults(). 现在,我可以通过lual_dofile和使用setVars()和/或executeresults()来调用LUA文件.然而,这里的问题是,在加载s2.lua之后,我无法再调用s1.lua的功能.这意味着我必须在s1.lua上重做lual_dofile才能重新获得对该功能的访问,因此我失去了对S2.LUA中的功能的访问. 是否可以简单地将所有LUA文件加载到一行中,然后随后开始随意调用其功能?类似于s1-> executeresults()s5-> executeresults()s3-> setVars()等. 我当前已经使用boost :: fileSystem在文件夹中检测所有LUA文件的系统已经对位进行了安装,然后我将这些文件名保
48 2023-03-15
编程技术问答社区
在lua中创建新的C库
我想知道如何在LUA 5.2.3中创建和使用新的C库.由于我在嵌入式系统上,我无法使用动态库(需要,共享库等).我找到了一个答案,但这是针对Lua 5.0( http://www.lua.org/pil/26.2.html ),因此不兼容.如果有人有主意? 解决方案 编辑这假设您的应用程序调用luaL_openlibs. 其他解决方案 lua 5.2对5.1/5.0的API更改 - 因此请使用
34 2023-03-15
编程技术问答社区
lua_open使用luaJIT返回null
使用最近的luajit lua_open返回null.常规LUA库不会发生这种情况. lua_State *L = lua_open(); std::cout #include //linked library: libluajit-5.1.a int main(int argc, const char * argv[]) { lua_State *L = luaL_newstate(); // lua_open(); std::cout
16 2023-03-15
编程技术问答社区
带有轻型用户数据的Lua注册表和引用之间的区别是什么?
因此,使用 Lua C API,您可以将 Lua 值保存在注册表中并稍后检索它.有不同的方法可以做到这一点,您可以创建一个变量并将其指针用作注册表中的键,因为它始终是唯一的.您可以将指针作为轻量用户数据推送. 您还可以使用 LuaL_ref(L, LUA_REGISTRYINDEX) 创建引用.一个比另一个有什么优势?什么时候用引用,什么时候用指针? 还有引用,因为它被称为引用,如果Lua垃圾收集器收集Lua值,注册表中的值会是nil吗?如果 Lua 更新了 Lua 值,注册表中的值也会改变吗? 解决方案 Lua 注册表只是另一个 lua 表,可以通过预定义的“特殊"索引轻松访问.我想您不需要解释 Lua 表与轻量用户数据有何不同. 您将如何索引注册表并不重要,只要您可以将该键存储在 C/C++ 端即可.为了您的方便,已经有函数(luaL_ref/luaL_unref)为您提供易于存储和移动的整数键. 关于垃圾回收 - 规则始终相同.只要值存储在未标记为弱表的
230 2022-07-26
编程技术问答社区