标签: lua-api

寻求"弱Lua注册表"

有没有办法让C以与使用参考系统相同的方式引用Lua 5.2中的对象,除了这些引用很弱并且可能随时被垃圾收集?换句话说,是否存在不影响对象引用计数的所有当前Lua对象的注册表?

lua lua-api

3
推荐指数
1
解决办法
509
查看次数

使用Lua C Api从索引获取数组值

我有这个数组:

a = {{4,2,2,6}, {2,1,1,2}}
Run Code Online (Sandbox Code Playgroud)

如何从该数组中检索索引到C程序?

例如:

a[1] -- {4,2,2,6}
a[1][2] -- 2
Run Code Online (Sandbox Code Playgroud)

c lua lua-api lua-table

3
推荐指数
1
解决办法
1549
查看次数

在运行之前,如何通过lua C API为一大块lua代码设置环境表?

我的游戏引擎的界面是使用标记语言和Lua构建的,类似于HTML和javascript.因此,可视元素将具有UI事件的处理程序,例如鼠标移动或单击,并且每次运行处理程序时,引擎将检查它是否已编译,如果不是,则将通过编译它luaL_loadstring.Handers可以通过元素复制或赋值(this.onclick = that.onclick)共享.

如何在运行之前设置一大块lua代码的环境?我们的想法是将元素和特定于事件的数据提供给块,并且还链接到父UI元素的环境. 删除了Lua 5.2更改lua_setfenv,因此我不确定如何完成此操作.该函数lua_load允许指定环境,但似乎只用于加载代码而不运行它.

c c++ lua lua-api

2
推荐指数
1
解决办法
2645
查看次数

加载模块未定义符号时出错: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;
}
Run Code Online (Sandbox Code Playgroud)

要从 lua 调用它,我使用以下代码:

luacall = require("luacall")
local f = luacall.fun1()
Run Code Online (Sandbox Code Playgroud)

我用这个命令编译它:

g++ -shared -Wl,-E,-soname,libluacall.so -o luacall.so luacall.c  -fPIC -llua -ldl
Run Code Online (Sandbox Code Playgroud)

当我尝试运行该脚本时,我在命令中收到以下错误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
Run Code Online (Sandbox Code Playgroud)

我真的对自己做错的事感到迷失。

c lua lua-api

2
推荐指数
1
解决办法
6471
查看次数

使用句柄从.lua调用lua函数?

我正在研究一个试图将lua与c ++集成的小项目.我的问题如下:

我有多个lua脚本,我们称之为s1.lua s2.lua和s3.lua.其中每个都具有以下功能:setVars()和executeResults().

现在,我可以通过LuaL_dofile调用lua文件,并在使用setVars()和/或executeResults()之后立即调用.这里的问题是,在我加载s2.lua之后,我再也无法调用s1.lua的函数了.这意味着我必须重做s1.lua上的LuaL_dofile以重新获得对该函数的访问权限,这样我就无法访问s2.lua中的函数.

有没有办法简单地加载所有lua文件,然后开始随意调用它们的函数?类似于s1-> executeResults()s5-> executeResults()s3-> setVars()等.

我目前已经有一个系统使用boost :: filesystem来检测文件夹中的所有lua文件,然后我将这些文件名保存在一个向量中,然后简单地迭代向量以连续加载每个lua文件.

在使用lua文件名填充向量时,我的插件加载函数现在看起来像这样:

void Lua_plugin::load_Plugins(){
 std::vector<std::string>::const_iterator it;
 for (it=Lua_PluginList.begin(); it!=Lua_PluginList.end(); it++){
  std::cout<<"File loading: " << *it << std::endl;
  std::string filename =  *it;
  std::string filepath = scriptdir+filename;
  if (luaL_loadfile(L, filepath.c_str()) || lua_pcall(L, 0, 0, 0)) {
   std::cout << "ScriptEngine: error loading script. Error returned was: " << lua_tostring(L, -1) << std::endl;
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

为了使它更清楚一点,我在.lua中的所有内容都是这样的:

-- s1.lua

setVars()
--do stuff
end

executeResults()
--dostuff
end
Run Code Online (Sandbox Code Playgroud)

等,但我希望能够在连续加载两个之后调用s1.lua的setVars()和s2.lua的setVars().

c++ lua lua-api

1
推荐指数
1
解决办法
2701
查看次数

测试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<double>(lua_tonumber(luaCtx, -1));

    // Figure out if int or float:
    double fractPart, intPart;
    fractPart = modf(n, &intPart);

    if (fractPart != 0.0)
    {
        luaVarType = ScriptVar::TypeTag::Float;
        luaVarData.asFloat = static_cast<float>(n);
    }
    else
    {
        luaVarType = ScriptVar::TypeTag::Integer;
        luaVarData.asInteger = static_cast<int>(n);
    }
}
Run Code Online (Sandbox Code Playgroud)

Lua API是否提供了更精确地推断变量类型的方法?

c++ lua lua-api

1
推荐指数
1
解决办法
4292
查看次数

lua_getmetatable 和 luaL_getmetatable 有什么区别

Lua API 有一个函数lua_getmetatable,如果值为 1,它将使用元函数获取表。
Lua 辅助库(它是 lua API 的一部分)有另一个函数luaL_getmetatable,它是一个宏,可以从LUA_REGISTRYINDEX. 但是这个库luaL_getmetafield中的另一个函数并不是你所期望的——它会在get_metatable的位置寻找一个方法。

为什么有两个不同的位置?每个元表什么时候使用?

lua lua-api metatable

1
推荐指数
1
解决办法
793
查看次数

标签 统计

lua ×7

lua-api ×7

c ×3

c++ ×3

lua-table ×1

metatable ×1