前言 在项目中使用C++与Lua互相调用,有的时候需要在lua脚本中,对C++的对象进行一些操作。 最开始的做法时,将这些对象声明为单例,或者是将对象放入单例之中,总之就是把对像放在一个全局可获取的地方,然后调用lua调用时获取对象再进行相应的操作。 不过这样的做法十分不优雅,并且当需要操作的对象类型多起来时,也并没有那么方便。 于是有了这么一个思路,将C++对象的指针转为void 通过函数返回值传递到lua脚本中,当需要对这个对象进行一些操作的时候,在操作函数的参数中将void的指针传递回来,然后使用强制类型转换…

2022年4月24日 0条评论 440点热度 1人点赞 大脸猫 阅读全文

lua是一个比较简单的脚本语言,我们可以用C/C++对它进行扩展。当我们使用C++与lua进行交互的时候,因为两种语言的数据结构是有很大的不同的,所以这个时候我们是通过虚拟栈来进行信息的交换的。 可以把虚拟栈看做一种数据容器,它可以存放lua中的任何数据类型包括函数。 luac //将栈的索引转换为正索引 LUA_API int (lua_absindex) (lua_State *L, int idx); //获取栈顶的索引(即栈的大小) LUA_API int (lua_gettop) (lua_State *…

2020年11月2日 0条评论 1701点热度 0人点赞 大脸猫 阅读全文

下载lua的源代码 https://www.lua.org/ 下载好之后,将源代码直接加入自己的工程。 在C++中调用lua代码主要有以下几个步骤 使用luaL_newstate()函数创建一个lua虚拟机。 使用luaL_openlib()函数载入lua基本库。 使用luaL _dostring()或者luaL_dofile()载入一个lua脚本。 使用lua_getglobal()将脚本中的全局变量压入栈,如果传入的是函数名那则相当于将函数指针压入栈顶。 调用栈中的数据。 C++代码 extern "C"{ #…

2020年10月15日 0条评论 2118点热度 3人点赞 大脸猫 阅读全文

在自己的C++中调用lua脚本时,遇到了一个比较麻烦的问题。因为在lua脚本中有调用C++提供的一些函数导致lua脚本再正常的lua运行环境中是没办法调试运行,但是不调试运行的脚本会有很多问题,比如语法错误,或者运行时的逻辑错误导致表的索引越界。最开始遇到这些问题的时候我只能在脚本中写相当多的print,这样来调试,但是后面脚本越写越复杂这样的调试方法效率就相当低了。 然后谷歌了一下,发现lua本身在运行脚本之前本来就会检查 一般在调用脚本之前我们会用luaL_dostring()或者luaL_dofile()载入…

2020年10月14日 0条评论 3585点热度 34人点赞 大脸猫 阅读全文

最近给项目做一个拓展的功能,用软件的仿真输出数据对仿真的输入进行优化。通过某种优化算法去修改仿真的输入数据使得输出数据接近预期值。整个功能的业务流程差不多是这样的。   最开始在思考程序结构的时候觉得有两个比较难的地方。 如何能让用户足够自由的去定义从输出到输入的这么一个过程。 如何解析用户输入的数学表达式。 关于第一点如果只是在输入界面上增加一些输入选项,那将很难达到 “足够自由的去定义输入” 的这么一个目标。要达到这个目标,需要输入的数据太多了,例如指定优化哪些参数、指定仿真结果数据的筛选方式、结果数…

2020年9月20日 0条评论 1689点热度 0人点赞 大脸猫 阅读全文