Tag: lua

如何将全局值从C传递给LUA?

最近我在我的C应用程序中嵌入了LUA,我现在要做的是我有一个值(Session_ID)我想从C函数传递给LUA脚本,以便LUA脚本可以使用它来调用一个函数回到C. 我在C中加载LUA脚本并运行它(使用lua_pcall)没有问题,我也没有问题从LUA内部调用C函数,我当前的问题是来回传递全局变量。 例如: 在C侧(test.c): session_id = 1; luabc_sz = rlen; result = lua_load(L, luaByteCodeReader, file, “script”, “bt”); if( lua_pcall(L, 0, 0, 0) != 0 ) 其中file是包含LUA脚本(script.lua)的数组。 在Lua side script.lua): print “Start” for i=1,10 do print(i, **session_id**) end print “End” “print”被我自己的函数覆盖,我想将session_id传递给它。 所以完整的场景是我在c函数中有session_id ,我想传递给LUA脚本,稍后将使用它来调用用C编写的print函数。 有任何帮助:)?

在Windows上使用gcc 5.3.0编译Lua 5.2.4模块

我需要使用gcc 5.3.0编译Lua 5.2.4模块。 在Windows上。 在此之前,我按以下步骤构建Lua 5.2.4: gcc -c -DLUA_BUILD_AS_DLL *.c ren lua.o lua.obj ren luac.o luac.obj ar rcs lua524-static.lib *.o gcc -shared -o lua524.dll -Wl,–out-implib,lua524.lib *.o gcc lua.obj lua524.lib -o lua524.exe gcc luac.obj lua524-static.lib -o luac524.exe del *.o *.obj 我想创建的动态库(.dll)写在下面(让我们称之为LuaMath: #include #include #include “lauxlib.h” #include “lua.h” static int IdentityMatrix(lua_State *L) { int in = lua_gettop(L); […]

从lua调用C函数

有人能告诉我是否有可能以某种方式调用c函数或简单地将其包装到lua函数中而不构建新模块。

Lua userdata:无法同时访问arrays和方法

我有这个人的问题: Lua userdata数组访问和方法 其中当我设置userdata的metatable的__index时,它总是调用getter,而不是我没有为meta-events声明的其他方法。 上面链接的解决方案是在Lua中,我尝试了一个看似不优雅的C实现,但无论如何,它创建了一个新问题,因为我的新方法不能再接受参数,我得到了这个错误: attempt to call method ‘asTable’ (a table value) 在这个Lua声明中: print_r(c:asTable() ) 这是我设置一切的方式: //Methods, many of which are overridden Lua meta-events (with the underscores) static const struct luaL_reg vallib_m [] = { {“asTable”, PushLuaTable}, //these functions are not called {“asCopy”, CopyLuaVal}, {“__newindex”, SetLuaVal}, {“__index”, GetLuaVal}, {“__tostring”, ValToString}, {“__gc”, GarbageCollectVal}, {“__metatable”, HideMetaTable}, […]

从源代码编译Lua并用它创建C模块

我想过从源代码编译Lua然后创建一个C模块。 我成功编译了Lua但我无法构建我的C模块。 所以,我像这样编译了Lua: gcc -o Lua *.c -Os -std=c99 像这样编译我的模块: gcc -Wall -shared -fPIC -o module.so -I. module.c 但是这里有一些错误: Undefined symbols for architecture x86_64: “_lua_pushcclosure”, referenced from: _luaopen_module in module-fb0b1f.o “_lua_pushnumber”, referenced from: _super in module-fb0b1f.o “_lua_setglobal”, referenced from: _luaopen_module in module-fb0b1f.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with […]

Lua嵌套从Lua到C的表

我很难将嵌套的Lua表转换为C json对象。 我正在使用LuaTableToJson(参见后面的代码),其中“index”是要检索的参数索引,PopOneArg例程根据其类型处理值。 当有一个嵌套表时,我想以递归方式调用LuaTableToJson,但是如果index = -1则不起作用。 问题:可以请某人点工作样本来检索从Lua到C的参数传递的嵌套表。或者有人可以在将嵌套表从Lua传递给C时解释堆栈结构。 谢谢 注意:对于C-> Lua,我有一个解决方案。 STATIC json_object *LuaTableToJson (lua_State* luaState, int index) { int idx; json_object *tableJ= json_object_new_object(); const char *key; char number[3]; lua_pushnil(luaState); // 1st key for (idx=1; lua_next(luaState, index) != 0; idx++) { // uses ‘key’ (at index -2) and ‘value’ (at index -1) if (lua_type(luaState,-2) == LUA_TSTRING) […]

如何在多个Lua State(multithreading)之间传递数据?

我在redis.lua中启动了Redis连接池,通过从C调用,我得到了一个redis_lua_state ,这个Lua状态是全局启动一次,其他线程只能从它获取 。 虽然有一个HTTP请求(工作线程),我需要从redis_lua_state获取redis连接,然后再获取另一个Lua状态以加载其他Lua脚本,这些脚本将使用此redis连接与Redis通信,如何做到这一点? 或者如何设计我的Lua脚本以使其简单? 代码示例: /* on main thread, to init redis pool connection */ lua_State *g_ls = NULL; lua_State *init_redis_pool(void) { int ret = 0; g_ls = luaL_newstate(); lua_State *ls = g_ls; luaL_openlibs(ls); ret = luaL_loadfile(ls, “redis.lua”); const char *err; (void)err; /* preload */ ret = lua_pcall(ls, 0, 0, 0); lua_getglobal(ls, “init_redis_pool”); ret […]

LuaJit FFI从C函数返回字符串到Lua?

说我有这个C函数: __declspec(dllexport) const char* GetStr() { static char buff[32] // Fill the buffer with some string here return buff; } 而这个简单的Lua模块: local mymodule = {} local ffi = require(“ffi”) ffi.cdef[[ const char* GetStr(); ]] function mymodule.get_str() return ffi.C.GetStr() end return mymodule 如何从C函数中获取返回的字符串作为Lua字符串: local mymodule = require “mymodule” print(mymodule.get_str())

Lua C API:在结构C中初始化变量矩阵

我正在尝试使用Lua C API创建一个userdata,其中有一个metatable关联,我将收集一个矩阵。 我不能得到的是如何将初始化矩阵的每个分量设置为零。 我正如我在此描述的那样编译我的Lua模块C代码。 我的C代码如下: #include “lauxlib.h” #include “lua.h” typedef struct { LUA_NUMBER data[1][1]; int row; int col; }matrix; // Create a matrix full of zeros static int lb_newmatrix(lua_State *L) { // Variable declarations int i,j; matrix *temp; // Input checks if (lua_gettop(L)!=2) { lua_pushstring(L,”\n Two input required”); lua_error(L); } //–> Check I° index […]

`lua_resume`的`from`参数的含义

来自Lua 5.2参考手册 : int lua_resume (lua_State *L, lua_State *from, int nargs); […] 参数from表示正在恢复L的协同程序。 如果没有这样的协程,则此参数可以为NULL 。 但它对我说不多。 它到底是做什么用的? 在什么情况下我必须传递除NULL以外的任何东西?