lua和c的交互
表的操作 map一样以key=value的方式存放数据,如Lua代码中的: tb = {"abc",12,true,x=10,y=20,z=30}? 前三个数据可以用tb[1]~tb[3]取得而后三个数据通过tb.x,tb.y,tb.z取得 存放的,这句Lua代码也可以写成: tb = {[1]="abc",[2]=12,[3] = true,["x"]=10,["y"]=20,["z"]=30}?? 它的形式就是[key]=value,所谓的tb.x只是tb["x"]的语法糖而已,如果愿意,也可以用tb["x"]取得 这个数据10。 ? ? int main() { //Lua示例代码,使用table char *szLua_code = "x = {} --用于存放结果的table " "x[1],x[2] = string.gsub(c.Str,c.Mode,c.Tag) --x[1]里是结果,x[2]里是替换次数 " "x.u = string.upper(x[1])"; //Lua的字符串模式 char *szMode = "(%w+)%s*=%s*(%w+)"; //要处理的字符串 char *szStr = "key1 = value1 key2 = value2"; //目标字符串模式 char *szTag = "<%1>%2</%1>"; lua_State *L = luaL_newstate(); luaL_openlibs(L); //把一个tabele送给Lua lua_newtable(L); //新建一个table并压入栈顶 lua_pushstring(L,"Mode");// key lua_pushstring(L,szMode);// value //设置newtable[Mode]=szMode //由于上面两次压栈,现在table元素排在栈顶往下数第三的位置 lua_settable(L,-3); //lua_settable会自己弹出上面压入的key和value lua_pushstring(L,"Tag");// key lua_pushstring(L,szTag);// value lua_settable(L,-3); //设置newtable[Tag]=szTag lua_pushstring(L,"Str");// key lua_pushstring(L,szStr);// value lua_settable(L,-3); //设置newtable[Str]=szStr lua_setglobal(L,"c"); //将栈顶元素(newtable)置为Lua中的全局变量c //执行 bool err = luaL_loadbuffer(L,szLua_code,strlen(szLua_code),"demo") || lua_pcall(L,0); if(err) { //如果错误,显示 cerr << lua_tostring(L,-1); //弹出栈顶的这个错误信息 lua_pop(L,1); } else { //Lua执行后取得全局变量的值 lua_getglobal(L,"x"); //这个x应该是个table if(lua_istable(L,-1)) { //取得x.u,即x["u"] lua_pushstring(L,"u"); //key //由于这次压栈,x处于栈顶第二位置 lua_gettable(L,-2); //lua_gettable会弹出上面压入的key,然后把对应的value压入 //取得数据,然后从栈中弹出这个value cout << "x.u = " << lua_tostring(L,-1) << endl; lua_pop(L,1); //取得x[1]和x[2] for(int i=1; i<=2; i++) { //除了key是数字外,与上面的没什么区别 lua_pushnumber(L,i); lua_gettable(L,-2); cout << "x[" << i <<"] = " << lua_tostring(L,-1) << endl; lua_pop(L,1); } } //弹出栈顶的x lua_pop(L,1); } lua_close(L); return 0; } ?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |