您的位置:首页 > 编程语言 > Lua

lua使用table例子

2014-05-24 11:05 429 查看
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

Stack.push(value)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: