8.lua调用c++函数传递表和参数类型检查

来源:互联网 发布:svm推荐算法 编辑:程序博客网 时间:2024/06/08 14:35
1.lua_next(L,3)
*先从栈顶弹出一个key
*从栈指定位置的table里取下一对key-value,先将key入栈再将value入栈
*如果第二部成功则返回非0值

c++:
//lua调用c++函数传递表key-value和参数类型,遍历
int CTestTable1(lua_State *L)
{
lua_pushnil(L); //先在栈顶压入一个空的,因为lua_next会先弹出一个key
while (lua_next(L, 1) != 0)//表在栈底
{
//先push key,push value
printf("%s = ", lua_tostring(L, -2));
printf("%s\n", lua_tostring(L, -1));
lua_pop(L, 1);//因为上面Lua_next会把key出栈,不会把value出栈所以要把value出栈
}
return 0;
}
//main
lua_register(L, "CtestArr1", CTestTable1);

lua:
-------------lua调用C++传递key-value表----------]
local tab = {name="xiaoming",age="18",id="123"};
CtestArr1(tab);


2.Lua调用c++遍历table,只取表中的一个数据
lua_pushnil(l);
while(lua_next(l,3) != 0)
{
printf("%s - %s\n",lua_tostring(l,-2),lua_tostring(l,-1)); //第一个参数是Lua,第二个是在栈中的位置,第三个是key
lua_pop(l,1);
}

c++:
int CTestTable2(lua_State *L)
{
lua_getfield(L,1,"name");//从栈底获取name的值放到栈顶
printf("name = %s\n",lua_tostring(L,-1)); //再从栈顶中取到值
}
//main()
lua_register(L, "CtestArr2", CTestTable2);
lua:
-----------------c++查看表中一个值-----------------
local tab = {name="xiaoming",age="18",id="123"};
CtestArr2(tab);

3.Lua调用c++参数类型检查,
luaL_checktype(l,1,LUA_TBOOLEAN);//不匹配就往下执行
if(LUA_type(l,1)!= LUA_TBOOLEAN)
{
luaL_argerror(l,1,"bad argument");
}

c++:
int CTestTable3(lua_State *L)
{
//1,真 //2 假
luaL_checktype(L,1,LUA_TTABLE);
//检查是否为表,真的会继续执行,假的话会停止整个Lua的执行

}
//main()
lua_register(L, "CtestArr3", CTestTable3);


lua:
//1 真
local tab = {"name = "xiaoming",age="22",id="007"};
//假 tab = 1;
CTestTable3(tab);

如果在实际的应用中希望检查又不希望停止就用这个

c++:
int CTestTable3(lua_State *L)
{
//1,真 //2 假
luaL_checktype(L,1,LUA_TTABLE); //判断第一个参数
//检查是否为表,真的会继续执行,假的话会停止整个Lua的执行
if(lua_type(L,2) != LUA_TUNMBER) //判断第二个参数
{
printf("para 2 is not number\n");
}

}
//main()
lua_register(lua,"CtestTable",CTestTable3);

lua:
local tab = {"name = "xiaoming",age="22",id="007"};
local size = 108;
//传数字type判断为真
CtestTable(tab,size);
//传字符串,判断错误也会执行
CtestTable(tab,"11111");

原创粉丝点击