lua使用table例子

table在Lua中唯一的数据结构,其它语言提供的各种数据结构Lua都是用table来实现的 。下面是一个C API操作table的例子。

#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main()
{
        
lua_State *L;
        L = luaL_newstate();
        luaL_openlibs(L);

        // ta = {'AA', 'BB', {'CC', 'DD'}}
         lua_newtable(L);
        //依次将各个元素放入table
        lua_pushnumber(L,1);
        lua_pushstring(L, "AA");
        lua_rawset(L,1);

        lua_pushnumber(L,2);
        lua_pushstring(L, "BB");
        lua_rawset(L,1);

        lua_pushnumber(L,3);
        lua_newtable(L);
        lua_pushstring(L, "CC");
        lua_rawseti(L,-2,1);

        lua_pushstring(L, "DD");
        lua_rawseti(L,-2,2);
        lua_rawset(L,1);

        lua_setglobal(L,"ta");
        //此时栈中为空,此处省略其他操作
        //将ta压入栈顶
        lua_getglobal(L, "ta");
        //获得第一个元素
        lua_rawgeti(L, 1,1);
        if(lua_type(L,-1) == LUA_TSTRING)
                printf("%s", lua_tostring(L,-1));
        lua_pop(L,1);

        lua_rawgeti(L, 1,2);
        if(lua_type(L,-1) == LUA_TSTRING)
                printf("%s", lua_tostring(L,-1));
        lua_pop(L,1);

        lua_rawgeti(L, 1,3);
        if(lua_type(L,-1) == LUA_TTABLE)
        {
                 //因为第三个元素是table,所以继续获得它的第一个元素
                lua_rawgeti(L, -1,1);
                if(lua_type(L,-1) == LUA_TSTRING)
                        printf("%s", lua_tostring(L,-1));
                lua_pop(L,1);

                lua_rawgeti(L, -1,2);
                if(lua_type(L,-1) == LUA_TSTRING)
                        printf("%s", lua_tostring(L,-1));
                lua_pop(L,1);                
        }
        lua_pop(L,1); //此时栈顶为ta
                              
        lua_close(L);

}




// -------------------------------------------------------------------------
// @ClientSvr(C/S): S
// @ClassName : --
// @LuaApiName: AddDynamicObstacle
// @Description: 添加一组动态障碍
// @ReturnCode
// @ArgumentFlag: s table d
// @ArgumentComment: 组名称:不能重复且小于64长度
// @ArgumentComment: 点数组table
// @ArgumentComment: 点数组大小
// @LuaMarkEnd
// -------------------------------------------------------------------------
int LuaAddDynamicObstacle(lua_State* L)
{
Log(eLogInfo, "**************Call script AddDynamicObstacle......");
int nSubWorldID= lua_tointeger(L, 1);
const char* pszName= lua_tostring(L, 2);
int nSize= 0;

XYLOG_FAILED_JUMP(lua_istable(L, 3));


nSize = (int)lua_objlen(L, 3);
XYLOG_FAILED_JUMP(nSize > 0);

for (int i = 1; i <= nSize; i++)
{
int nSubIndex = 0;
int nX = 0;
int nY = 0;


lua_rawgeti(L, 3, i);
nSubIndex = lua_gettop(L);
XYLOG_FAILED_JUMP(lua_istable(L, -1));


lua_rawgeti(L, nSubIndex, 1);
nX = lua_tointeger(L, -1);


lua_rawgeti(L, nSubIndex, 2);
nY = lua_tointeger(L, -1);


Log(eLogInfo, "********* x=%d, y=%d", nX, nY);
}


Log(eLogInfo, "******nSubWorldID=%d, name=%s, size=%d", nSubWorldID, pszName, nSize);
//KSubWorld* pSubWorld = g_SubWorldSet.GetMapByIndex(nSubWorldID);
//if (pSubWorld)
//pSubWorld->AddDynamicObstacle(pszName, points, nSize);

Exit0:
return 0;// /? ReLoadSkill(1,"jhhh", {{2,3},{4,5},{7,9}})   2.获取到调用者地图 npc身上有
// /? AddDynamicObstacle(1,"ss",{{1,2},{8,188}})
}


明白了:我本省就2个参数压栈,最后自带一个wsId压,3个,lua_rawgeti()会把这个(table)元素压入到栈顶,变成4个元素,
因为栈顶又是个表,所有再次lua_rawgeti(),把这个表的子元素压入到栈顶,然后再取出来,变成6个元素,
下一次遍历的时候,把下一个tab压入栈顶,那就是7了。然后8,9搞定。


5. 对table的一些操作[不引发原方法]
void lua_rawget (lua_State *L, int index)

和lua_gettable操作一样

但是不触发相应的元方法

  

void lua_rawgeti(lua_State *L, int index, int n)

操作:   ele = Stack[index]

        value = ele[n]

        Stack.push(value)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值