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
结果: