设为首页 加入收藏

TOP

菜鸟入门之lua与c++相互调用(包含多个demo)(一)
2015-07-20 17:50:13 来源: 作者: 【 】 浏览:17
Tags:菜鸟 入门 lua 相互 调用 包含 多个 demo

前两篇文章中,已经介绍了使用vs2010编译lua5.1源码生成lua.lib 和 vs项目中使用c++调用lua,可以保证demo在vs上运行起来了。这里再详细介绍下c++和lua之间的相互调用以及原理。

c++与lua直接的调用,实际上通过一个栈结构来传递数据,该栈结构栈顶的索引值为-1,向栈底方向索引值依次为-1 ,-2......栈顶索引为1.栈结构里可以放函数,表,字符串,整形等各种lua的基本数据。

一、在当前cpp目录下创建test.lua文件,用于与c++交互调用,代码如下:

?

print(hello world ?from lua file)
table1 = {}
table1[dinner] = rice
table1[hahha] = ri123ce
gScreenW = 1280;
function getIntegerSumFuncs(a ,b)
	return a + b
end
avg ,sum = average(10 ,20 ,30 ,40 ,50)

?

二、先熟悉下lua常用的C语言API。

int luaL_dofile (lua_State *L, const char *filename);//运行lua文件,L是当前已经创建的栈结构。返回0,运行文件正常;返回1,代表出现异常。

void lua_setglobal (lua_State *L, const char *name);//从堆栈上弹出一个值,并将其设到全局变量 name 中

void lua_getglobal (lua_State *L, const char *name);//把全局变量 name 里的值压入堆栈,栈顶值为-1。

const char *lua_tostring (lua_State *L, int index);//在栈L的索引值为index处取值并转化成C字符串(lua_tointeger等类似)

void lua_settop (lua_State *L, int index);//参数允许传入任何可接受的索引以及 0。它将把堆栈的栈顶设为这个索引。 如果新的栈顶比原来的大,超出部分的新元素将被填为 nil 。 如果 index 为 0 ,把栈上所有元素移除。

int lua_gettop (lua_State *L);//返回堆栈上的元素个数(返回 0 表示堆栈为空)

int lua_next (lua_State *L, int index);从栈上弹出一个 key(键), 然后把索引指定的表中 key-value(健值)对压入堆栈 (指定 key 后面的下一 (next) 对)。 如果表中以无更多元素, 那么 lua_next 将返回 0 (什么也不压入堆栈)。

void lua_pushinteger (lua_State *L, lua_Integer n);//把 n 作为一个数字压栈。

void lua_close (lua_State *L);//销毁指定 Lua 状态机中的所有对象

如果需要查询其他函数,推荐到Lua 5.1 参考手册,很详细也比较准确。

三、c++获取lua中的全局字符串。

?

//获取lua全局string
const char* getLuaGlobalString(char *fileName ,char *varName) 
{
	lua_State *L = lua_open();
	luaL_openlibs(L);
	//加载并运行test.lua文件
	int isOpen = luaL_dofile(L ,fileName); 
	if (isOpen == 0) {
		printf(error loading lua);
	}
	//将栈顶的索引设置为该index,如果index传0,移除栈上所有元素
	lua_settop(L ,0); 
	//把全局变量 allGlobalChar 里的值压入堆栈。
	char *allGlobalChar = varName; 
	lua_getglobal(L ,allGlobalChar); 

	int stateCode = lua_isstring(L ,1); 
	if (stateCode != 1) {
		printf(open lua error code:%d ,stateCode);
		return NULL;
	}
	const char* s = lua_tostring(L ,1);
	printf(get global screenW is:%s 
 ,s);
	lua_pop(L ,1);
	lua_close(L);
	return s;
}
调用代码:

?

?

getLuaGlobalString(test.lua ,gScreenW);

?

四、c++获取lua table中的的值

?

?

const char* getLuaVarOfTable(const char *fileName,const char *tableName ,const char *keyName)
{ 
	lua_State *L = lua_open();
	luaL_openlibs(L);
	int isOpen = luaL_dofile(L ,fileName);
	if (isOpen != 0) 
	{
		printf(error open lua file);
		return NULL;
	}
	lua_settop(L ,0);//清空栈
	lua_getglobal(L ,tableName);

	int stateCode = lua_istable(L ,-1);//取栈顶
	if (stateCode != 1) 
	{
		printf(get table failed code:%d ,stateCode);
		return NULL;
	}
	lua_pushstring(L ,keyName);
	lua_gettable(L ,-2); //取栈顶下一个元素
	const char* valueStr = lua_tostring(L ,-1); //取栈顶
	printf(get lua table key-value %s-%s ,keyName ,valueStr);
	lua_pop(L ,-1);
	return valueStr;
}
调用代码:

?

?

getLuaVarOfTable(test.lua ,table1 ,dinner);

?

五、c++获取获取lua中的表

 
 
string getLuaVarTable(const char* fileName ,const char *tableName ,char *result) { lua_State *L = lua_open(); luaL_openlibs(L); int isOpen = luaL_dofile(L ,fileName); if (isOpen != 0) { printf(error open lua file); return NULL; } lua_getglobal(L ,tableName); int size = lua_gettop(L); lua_pushnil(L); int index = 0; while(lua_next(L ,size)) { const char* key = lua_tostring(L ,-2);//取栈顶下一个元素 const char* value = lua_tostring(L , -1); //取栈顶 //使用memcpy ,index记录地址游标 memcpy(&result[index] ,
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVA - 1478 Delta Wave (大数+卡.. 下一篇hdu4972 数学杂题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Sphinx : 高性能SQL (2025-12-24 10:18:11)
·Pandas 性能优化 - (2025-12-24 10:18:08)
·MySQL 索引 - 菜鸟教 (2025-12-24 10:18:06)
·Shell 基本运算符 - (2025-12-24 09:52:56)
·Shell 函数 | 菜鸟教 (2025-12-24 09:52:54)