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();
?
?