lua和c的交互

表的操作
上面的列表中并没有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

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...