13.C++调用Lua函数错误显示和堆栈清理

1.C++调用Lua函数错误显示和堆栈清理
c++:
//c++调用Lua函数
lua_getglobal(L,"event111");
lua_pcall(L,0,0,0); //2.要调用函数的参数,3,函数处理返回值,4,错误输出的函数,0则说明不出,用pcall本身来处理,并将错误压入栈中

printf("top is %d\n",lua_gettop(L)); //打印栈大小
lua_getglobal(L,"event222");
if(lua_pcall(L,0,0,0) != 0)
{
printf("call event failed %s\n",lua_tostring(L,-1)); //错误的时候会把错误信息压倒栈顶
lua_pop(L,1); //将错误信息出栈
} 
printf("top is %d\n",lua_gettop(L));




lua:

结果:


2.增加参数和错误处理
c++:
//3.C++调用Lua函数,函数传参出错处理
printf("3top is %d\n",lua_gettop(L)); //打印栈大小
lua_getglobal(L,"event333");
lua_pushstring(L,"key");
if(lua_pcall(L,1,0,0) != 0) //2.代表有一个参数就是上面的key
{
printf("call event failed %s\n",lua_tostring(L,-1)); //错误的时候会把错误信息压倒栈顶
lua_pop(L,1); //将错误信息出栈
}
printf("3top is %d\n",lua_gettop(L));




lua:
--------------------3.C++调用Lua函数,函数传参出错处理-----------------
function event333(e) --e这个参数是c++传递过来的
print("c++ call lua function");
print(e);
return "lua event return"
end



结果:


----------------------4.c++调用lua函数,lua返回字符串---------------------
c++:
//4.c++调用lua函数,lua返回字符串
printf("4top is %d\n",lua_gettop(L)); //打印栈大小
lua_getglobal(L,"event444");
lua_pushstring(L,"key");
if(lua_pcall(L,1,1,0) != 0) //2.代表有一个参数就是上面的key,3.代表返回值个数,写1
{
printf("call event failed %s\n",lua_tostring(L,-1)); //错误的时候会把错误信息压倒栈顶
lua_pop(L,1); //将错误信息出栈
}
else{ //正确的时候才有返回值
printf("lua return : %s",lua_tostring(L,-1));
lua_pop(L,1); //出栈,因为返回值被压到栈顶了
}
printf("4top is %d\n",lua_gettop(L));



lua部分:
----------------------4.c++调用lua函数,lua返回字符串---------------------
function event444(e)
print("c++ call lua function");
print(e);
return "lua event return"; ---返回值
end



结果:

5.C++调用Lua函数出错是执行错误处理函数

C++:
printf("5top is %d\n",lua_gettop(L)); //打印栈大小
lua_getglobal(L,"event555");
lua_getglobal(L,"ferror"); //错误处理函数
lua_pushstring(L,"key");
if(lua_pcall(L,1,1,-3) != 0) //2.代表有一个参数就是上面的key,3.代表返回值个数,写1 ,4.是出错处理函数的栈空间
{
printf("call event failed %s\n",lua_tostring(L,-1));
//现在这里就跟之前不太一样了,之前是pcall返回的错误被压入到栈中,现在是一出错就调用出错处理函数ferror,等ferror处理完,将//返回值压入到栈中,这时才到这里,所以这里的值是出错函数返回的值
lua_pop(L,1); //将错误信息出栈
}
else{ //正确的时候才有返回值
printf("5lua return : %s\n",lua_tostring(L,-1));
lua_pop(L,1); //出栈,因为返回值被压到栈顶了
}
lua_pop(L,1); //因为之前的出错处理函数也入栈了,在这里也要将他出栈
printf("5top is %d\n",lua_gettop(L));



lua:
------------------------5C++调用Lua函数出错是执行错误处理函数---------------
function ferror(e)
print("c++ call lua failed ferror = "..e);
return "lua change error";
end



结果:

---因为上面的那种方法在使用的时候要算一下出错处理函数perror所在栈空间才能传参数给pcall,不方便,改为:
6.C++调用Lua函数出错是执行错误处理函数(改进):
C++:
printf("6top is %d\n",lua_gettop(L)); //打印栈大小
int errfun = lua_gettop(L); //记录栈顶位置
lua_getglobal(L,"event666");
errfun++; //每加一个函数,都+1,因为栈是从上往下加的,所以从下往上数是不变的,注意加函数只能在定义出错处理函数上面才正确
lua_getglobal(L,"ferror"); //错误处理函数
lua_pushstring(L,"key");
if(lua_pcall(L,1,1,errfun) != 0) //2.代表有一个参数就是上面的key,3.代表返回值个数,写1 ,4.是出错处理函数的栈空间
{
printf("call event failed %s\n",lua_tostring(L,-1)); //现在这里就跟之前不太一样了,之前是pcall返回的错误被压入到栈中,现在是一出错就调用出错处理函数ferror,等ferror处理完,将//返回值压入到栈中,这时才到这里,所以这里的值是出错函数返回的值
lua_pop(L,1); //将错误信息出栈
} 
else{ //正确的时候才有返回值
printf("6lua return : %s\n",lua_tostring(L,-1));
lua_pop(L,1); //出栈,因为返回值被压到栈顶了
}
lua_pop(L,1); //因为之前的出错处理函数也入栈了,在这里也要将他出栈
printf("6top is %d\n",lua_gettop(L));



LUA:
------------------------6C++调用Lua函数出错是执行错误处理函数(改进)----------
function event666(e)
print("6c++ call lua function");
print(e);
return "lua event return"; ---返回值
end



结果:



7.c++调用Lua函数获取返回表:
C++:
//7.c++调用Lua函数获取返回表
printf("7top is %d\n",lua_gettop(L)); //打印栈大小
int errfun77 = lua_gettop(L); //记录栈顶位置
lua_getglobal(L,"ferror777"); //错误处理函数
errfun77++; //每加一个函数,都+1,因为栈是从上往下加的,所以从下往上数是不变的,注意加函数只能在定义出错处理函数上面才正确
lua_getglobal(L,"event777");
lua_pushstring(L,"key7");
lua_newtable(L); //创建一个表
lua_pushstring(L,"name");
lua_pushstring(L,"xiaoming");
lua_settable(L,-3);
if(lua_pcall(L,2,1,errfun77) != 0) //2.代表有一个参数就是上面的key,3.代表返回值个数,写1 ,4.是出错处理函数的栈空间
{
printf("7call event failed %s\n",lua_tostring(L,-1)); //现在这里就跟之前不太一样了,之前是pcall返回的错误被压入到栈中,现在是一出错就调用出错处理函数ferror,等ferror处理完,将//返回值压入到栈中,这时才到这里,所以这里的值是出错函数返回的值
lua_pop(L,1); //将错误信息出栈
}
else{ //正确的时候才有返回值
lua_getfield(L,-1,"id");
printf("return table id is %d\n",(int)lua_tonumber(L,-1));
//printf("7lua return : %s\n",lua_tostring(L,-1));
lua_pop(L,2); //出栈,因为返回值被压到栈顶了
}
lua_pop(L,1); //因为之前的出错处理函数也入栈了,在这里也要将他出栈
printf("7top is %d\n",lua_gettop(L));




lua:
------------------------7C++调用Lua函数获取返回表---------
function ferror777(e)
print("7c++ call lua failed ferror = "..e);
return "lua change error";
end

function event777(e,obj)
print("7c++ call lua function");
print(e);
print(obj.name);
local re = {id=123};
return re; ---返回值
end





结果:




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值