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

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

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

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

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

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程序通过一个堆栈交换数据: 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\n",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",n);
	FOR_LIST(1,10,1,lua); //
	//lua_pop(lua,3) ;//按照堆栈 后进先出的方式弹出三个参数
	n=lua_gettop(lua);
	printf("lua堆栈中有%d个参数\n",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 脚本调用成功!\n");
	}
	//弹出堆栈所有数据
	CLEAR(lua);

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

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

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


时间: 2024-10-02 13:53:53

在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包的相关文章

C++ 和 Lua 绑定库 Eluna 升级支持 Lua 5.3

ELuna是一个简单,轻量级的用来完成C++和Lua之间相互绑定的工程.它不依赖于任何第三方库,主要思想来源于一个简单的工程Luna,其最开始 的目的也是在Luna做一些扩展,让使用者在编写代码时不必再关注C++和Lua之间交互时的细节,只需调用Eluna提供的简单的API便能轻松的完成 绑定c++类,成员函数,函数或绑定Lua函数,Table的任务. eluna升级: 支持lua5.3. 优化参数校验和错误提示. 文章转载自 开源中国社区[http://www.oschina.net]

Lua OS 0.11.1发布 Lua's封装工具

Lua OS 0.11.1这个版本增加了自动化系统调整,获得Windows密钥功能和笔记本触摸板的功能. Lua是一个简单有趣的脚本语言.Lua OS是一个以Lua's封装为基础来完成OS的功能,如系统休眠,登录,重启,移动,流动性和灵活的安全http://www.aliyun.com/zixun/aggregation/6926.html">管理能力. 下载地址:http://luaos.net/download/files/luaos-0.11.1.zip

lua元表和元方法 《lua程序设计》 13章 读书笔记

lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmetatable(t)) --显示过元表 此时是nil --可以用setmetatable来设置或修改任何table的元表 t1 = {} setmetatable(t,t1) assert(getmetatable(t) == t1) 任何table可以作为任何值的元表,而一组相关的table可以共享

【COCOS2DX-LUA 脚本开发之十一】C/C++与LUA之间进行数据函数交互以及解决“PANIC: UNPROTECTED ERROR IN CALL TO LUA API (ATTEMPT TO INDEX A NIL VALUE)”的问题

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1343.html 在使用Cocos2d-x 时候,难免需要C/C++调用Lua函数.数据或Lua调用C/C++函数,那么本篇讲详细介绍C/C++与Lua之间的数据.函数交互. 首先让我们来简单了解几个Lua API函数: int   luaL_dofile (lua_State *L, const char *filena

[Lua]lua闭包

前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结.希望对大家学习Lua有帮助. 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: 1 2 3 4 5 6 7 8 9 10 11 function newCounter()      local i = 0      return function () -- 匿名函数           i = i + 1           retur

Lua数据结构 &amp;#8212; 闭包(四)

作者:罗日健 前面几篇文章已经说明了Lua里面很常用的几个数据结构,这次要分享的也是常用的数据结构之一 – 函数的结构.函数在Lua里也是一种变量,但是它却很特殊,能存储执行语句和被执行,本章主要描述Lua是怎么实现这种函数的. 在脚本世界里,相信闭包这个词大家也不陌生,闭包是由函数与其相关引用环境组成的实体.可能有点抽象,下面详细说明: 一. 闭包的组成 闭包主要由以下2个元素组成: 函数原型:上图意在表明是一段可执行代码.在Lua中可以是lua_CFunction,也可以是lua自身的虚拟机

Lua中的闭包小结_Lua

前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结.希望对大家学习Lua有帮助. 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: 复制代码 代码如下: function newCounter()      local i = 0      return function () -- 匿名函数           i = i + 1           return i      end

Lua和C++语言的交互详解_Lua

前言 写过Windows程序的人都知道,对于应用程序,如果需要在本地保存一些配置信息,我们经常将这些配置信息写在注册表或者本地的配置文件中,很多应用都是将一些配置信息写在配置文件中,比如以ini结尾的文件,这种配置文件很多,使用的很广泛,然后应用程序在启动的时候,就会解析这个配置文件,读取一些配置信息. Lua的一项重要用途就是作为一种配置语言.而这篇文章将结合Lua来扩展应用程序,这种方式提供了更大的灵活性和便利性. 这篇博文主要总结的是使用C++和Lua进行交互,涉及到获取Lua中普通变量的

lua闭包的理解以及表与函数的几种表达方法_Lua

前一段时间,在学习lua语言时,看lua中文教程,在读闭包这一节时,看了好几遍,对闭包这个概念还是很模糊,不能清楚的理解它是怎么回事 最近工作不是很忙,所以就自学了一些lua的知识,但是才看了两个多小时就遇见了一个问题--闭包.好吧,我是看见它第一眼的时候以为是和close之类有关的巴拉巴拉....(原谅我的无知)!但是越往下看越迷茫,所以就网上看了好多大师写的东西学习学习,特此记录一下,以便日后看到不会.....被人鄙视 在lua中函数也是变量,可以存储在表中,也可以是函数的参数,或是返回值,