设为首页 加入收藏

TOP

菜鸟入门之lua与c++相互调用(包含多个demo)(二)
2015-07-20 17:50:13 来源: 作者: 【 】 浏览:19
Tags:菜鸟 入门 lua 相互 调用 包含 多个 demo
key ,strlen(key)); index += strlen(key); //因为sizeof取字符串,最后会有/0占一个字节,所以应该减去1 memcpy(&result[index] ,- ,sizeof(-) - 1); index += 1; memcpy(&result[index] ,value ,strlen(value)); index += strlen(value); lua_pop(L ,1); } result[index] = 0; cout <

调用代码:

   

?

?

char* reslut = (char*)malloc(100 * sizeof(char));
	getLuaVarTable(test.lua ,table1 ,reslut);
	free(reslut);

?

六、cpp调用lua中的函数

?

?

//要调用一个函数请遵循以下协议: 首先,要调用的函数应该被压入堆栈;
//	接着,把需要传递给这个函数的参数按正序压栈; 这是指第一个参数首先压栈。 
//	最后调用一下 lua_call; nargs 是你压入堆栈的参数个数。 
//	当函数调用完毕后,所有的参数以及函数本身都会出栈。 而函数的返回值这时则被压入堆栈。 
//	返回值的个数将被调整为 nresults 个, 除非 nresults 被设置成 LUA_MULTRET。 
//	在这种情况下,所有的返回值都被压入堆栈中。 Lua 会保证返回值都放入栈空间中。
//	函数返回值将按正序压栈(第一个返回值首先压栈), 因此在调用结束后,最后一个返回值将被放在栈顶。
const char* callLuaFunc(const char* fileName ,const char* functionName)
{
	lua_State *L = lua_open();
	luaL_openlibs(L);
	int isOpen = luaL_dofile(L ,fileName);
	if (isOpen != 0) {
		printf(error open lua file %s ,fileName);
		return NULL;
	} 
	lua_getglobal(L ,functionName);//如果表和函数重名,会怎么样
	lua_pushinteger(L ,12);
	lua_pushinteger(L ,3);
	//第一个参数:函数的个数 第二个参数:函数的返回值个数
	lua_call(L ,2 ,1);
	int result = lua_tointeger(L ,-1);
	printf(call lua func result : %d ,result);
	return NULL;
}
调用代码:

?

?

callLuaFunc(test.lua ,getIntegerSumFuncs);

?

七、lua调用cpp函数计算平均值

?

?

//cpp计算平均值的函数
int average(lua_State* L) 
{
	int n = lua_gettop(L);
	double sum = 0;
	int i;
	for (i = 1; i <= n; i ++)
	{
		if (!lua_isnumber(L ,i)) 
		{
			lua_pushstring(L ,incorrect argument to avg);
			lua_error(L);
		}
		sum += lua_tonumber(L ,i);
	}
	lua_pushnumber(L ,sum / n);
	lua_pushnumber(L ,sum);
	//这里一定要返回元素个数,若返回0则找不到结果
	return 2;
}

//lua调用cpp计算平均值,调用入口
int averageMain() 
{
	lua_State* L = lua_open();
	luaL_openlibs(L);
	//注册lua函数,实际上是将average push到栈结构,然后set average函数为global函数
	lua_register(L ,average ,average);
	//运行脚本
	luaL_dofile(L ,test.lua);

	//把全局变量 avg 里的值压入堆栈
	lua_getglobal(L ,avg);
	// 栈顶是-1,栈底是1
	cout << cpp show: avg is  << lua_tointeger(L ,-1) <
    
     代码调用:
     
averageMain();

?

?







首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVA - 1478 Delta Wave (大数+卡.. 下一篇hdu4972 数学杂题

评论

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

·Java多线程基础 - 华 (2025-12-24 13:20:10)
·深入解读Java多线程 (2025-12-24 13:20:08)
·Spring Boot 中文文档 (2025-12-24 13:20:04)
·如何理解智能指针? (2025-12-24 12:48:26)
·c++是否应避免使用普 (2025-12-24 12:48:23)