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搞定。
和lua_gettable操作一样
但是不触发相应的元方法
void lua_rawgeti(lua_State *L, int index, int n)
操作: ele = Stack[index]
value = ele
Stack.push(value)
#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)
相关文章推荐
- Lua的Table表使用例子(便于使用查询)
- 使用TableColumnModel和AbstractTableModel的一個例子
- 使用JCombox实现TableCellRenderer作为JTable的单元格例子
- 关于cocos2dx之lua使用TableView
- lua使用之table长度获取
- c/c++_Lua交互----关于Lua中table类型的使用实例
- pl/sql中使用table()函数的例子
- lua table使用记录(2)
- Lua中使用table.concat连接大量字符串实例
- lua中类的属性是table时,多个类的实例使用了同一个table属性
- lua中使用json:table转json与json转table
- C函数传递一个table给lua代码中使用。
- cocos2d-x-LuaProxy学习日志(4) -- TableView使用
- lua中table中嵌套table的使用
- load data infile into table 的使用例子
- lua排序table的闭包函数使用
- 使用AbstractTableModel構造JTable的一個例子
- load data infile into table 的使用例子
- lua table 基本使用
- 【笨木头Lua专栏】基础补充09:使用table.concat连接大量字符串