加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua和c的交互

发布时间:2020-12-14 22:03:34 所属栏目:大数据 来源:网络整理
导读:表的操作 上面的列表中并没有lua_pushtable和lua_totable,那么怎样取得或设置Lua中的table数据呢? 在Lua中,table是一个很重要的数据类型,在table中不仅可以象C中的数据一样放一组数据,还可以象 map一样以key=value的方式存放数据,如Lua代码中的: tb =

表的操作
上面的列表中并没有lua_pushtable和lua_totable,那么怎样取得或设置Lua中的table数据呢?
在Lua中,table是一个很重要的数据类型,在table中不仅可以象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的table中,所有的数据都是以key=value的形式

存放的,这句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; 
} 


?


出处:http://www.voidcn.com/article/p-orfkpdub-x.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读