在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

LUA可谓是配置文件神器,具体功能用过才知道,接近两年没用了抽了俩小时熟习了下基本的用法。

包括C/LUA堆栈操作 函数相互调用 和LUA的闭包 C++和LUA相互闭包

想要灵活使用LUA必须先要学习 LUA和C的堆栈交互模型 类似于汇编函数调用方式了 很成心思。

要学习LUA首先要理解LUA和C/C++交互的堆栈lua_State  这里援用网友的1篇文章很详细

http://wind-catalpa.blog.163.com/blog/static/1147535432013119103150929/

上代码

C++代码

<span style="font-size:14px;color:#000000;">#include "string.h"
extern "C"
{

#include "lualib.h" //包括lua lib
#include "lauxlib.h" //辅助函数
};
#pragma comment(lib,"lua.lib")
//Lua和C程序通过1个堆栈交换数据: lua_State
lua_State* GetLua()
{
lua_State* lu = luaL_newstate(); /*创建Lua对象*/
luaL_openlibs(lu); // 打开所有 同享库函数 到lua 对象
return lu ;
}

//批量数据压入堆栈
#define FOR_PUSH(I,J,STEP,LUA)
for(int i=I;i<=J;i+=STEP)
{
lua_pushinteger(LUA,i);
}
//取出堆栈中指定index的数据
//打印堆栈数据
#define FOR_LIST(I,J,STEP,LUA)
for(int i=I;i<=J;i+=STEP)
{
int n=lua_tointeger(LUA,i);
printf("堆栈中Index:%d,数据:%d
",i,n);
}

#define CLEAR(LUA)
for(int i=1;i<=lua_gettop(LUA);i++)
lua_pop(LUA,i)

//返回1个结果
//函数原型具体参照LUA5.2文档
int callCPP(lua_State *lua)
{
int a = lua_tointeger(lua, 1);
int b = lua_tointeger(lua, 2);
lua_pushnumber(lua, a+b); //结果压栈
return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
//获得C和Lua交互的堆栈指针
lua_State *lua =GetLua();
if(lua==nullptr)
{
printf("Lua Open Error");
return 0;
}
//关于Lua的堆栈操作
FOR_PUSH(1,10,1,lua);//循环顺序入堆栈的参数
int n=lua_gettop(lua);
printf("lua堆栈中有%d个参数
",n);
FOR_LIST(1,10,1,lua); //
//lua_pop(lua,3) ;//依照堆栈 落后先出的方式弹出3个参数
n=lua_gettop(lua);
printf("lua堆栈中有%d个参数
",n);
FOR_LIST(1,n,1,lua); //
//履行简单内存LUA脚本
char*pLua="print ("hello,lua!")";
luaL_loadbuffer(lua,pLua,strlen(pLua),"testLuaScript0Chunk");
if(LUA_OK==lua_pcall(lua, 0,0,0))
{
printf("lua 脚本调用成功!
");
}
//弹出堆栈所有数据
CLEAR(lua);

///加载lua脚本 并且编译运行lua脚本
//从当前工作目录加载
if(luaL_dofile(lua,"./c.lua"))
{
printf("lua脚本加载成功!
");
}
lua_getglobal(lua,"num1");//加载到堆栈
lua_getglobal(lua,"num2");//加载到堆栈
lua_getglobal(lua,"str1"); //加载字符串
int num1 = lua_tointeger(lua, ⑶); //逆向取值 从堆栈 LUA堆栈为双向
printf("num1:%d
",num1);
n=lua_gettop(lua);
int num2 = lua_tointeger(lua, ⑵); //逆向取值 从堆栈 LUA堆栈为双向
printf("num2:%d
",num2);
n=lua_gettop(lua);
printf("lua堆栈中有%d个参数
",n);
CLEAR(lua);
//加载函数到堆栈
//调用的是无参函数
lua_getglobal(lua,"testHello") ;
n=lua_gettop(lua);
printf("lua堆栈中有%d个参数
",n);
//lua 函数调用会自动清算堆栈
lua_pcall(lua, 0,0,0);
n=lua_gettop(lua);
printf("lua堆栈中有%d个参数
",n);

lua_getglobal(lua,"Closer") ; //函数压入栈顶
lua_pushinteger(lua,1);
lua_pushinteger(lua,2);//压入参数
//闭包函数调用
if(LUA_OK!=lua_pcall(lua,2,1,0))
{
printf("函数调用失败!
");
return 0 ;
}

int result=lua_tointeger(lua,⑴);//取出栈顶数据
printf("Closer result:%d
",result);
//注意清算堆栈返回值在 栈顶 POP1下
lua_pop(lua,1);
n=lua_gettop(lua);
printf("lua堆栈中有%d个参数
",n);
/////LUA调用C++函数
//注册函数
lua_register(lua, "CallC", callCPP);
//从当前工作目录加载
if(luaL_dofile(lua,"./c1.lua"))
{
printf("lua c1脚本加载成功!
");
}
///C/LUA闭包调用
lua_pushcfunction(lua,callCPP);
lua_setglobal(lua,"CallCT");//设置lua中的调用
lua_getglobal(lua,"CloserT");//加载lua闭包函数到C++堆栈
lua_pushinteger(lua,2); //函数堆栈参数1定要正确
lua_pushinteger(lua,3);
lua_pcall(lua,2,0,0);
n=lua_gettop(lua);
printf("lua堆栈中有%d个参数
",n);

return 0;
}

</span>

c.lua 和c1.lua文件

–c.lua

str1="hello,I am Luaer"
num1=2
num2=3
–测试函数输出 str1
function testHello()
print(str1)
end
–lua实现闭包
function Closer(i,j)
function add(i,j)
return i+j
end
return add(i,j)
end

function CallC(a,b)
return callCPP(a,b)
end

–c1.lua call C++ function
num=CallC(3,4)
print ("num is:",num)
–c++和lua相互闭包
function CloserT(a,b)
num1=CallCT(a,b)
print ("C++/LUA相互闭包 Num1 is:",num1)
end


波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡