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)

lua使用table例子相关推荐

  1. Lua 的table遍历 【转】

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rangercyh.blog.51cto.com/1444712/1032925 ...

  2. Lua 之table的测试

    一.lua 的 table构造 1.字符串作为table索引 法1. MyTable = {x = "xixi"} 法2. MyTable = {["x"] = ...

  3. Lua 中 table 库函数 table.concat 连接 函数

    Lua 中 table 库函数 table.concat 连接 函数 do--> table.concat 连接 函数 tab = {"a", "c", ...

  4. lua之table的使用

    本文对从数据结构,存储和使用三个角度对lua之table的使用进行小结. 数据结构: table是lua的一种数据结构,可以用来存放各种类型的元素,例如可以创建数组和字典,以及二者混合的数据结构, 例 ...

  5. 【游戏开发解答】Unity使用lua将table转为树结构,以多级折叠内容列表的UI形式展现(树结构 | UGUI | 折叠展开 | lua)

    文章目录 一.前言 二.Unity lua环境 三.树节点 1.创建脚本:TreeNode.lua 2.封装节点 四.树逻辑 1.创建脚本:TreeLogic.lua 2.构造测试数据 3.构造树 4 ...

  6. lua中table.和table[]的区别

    lua中table.和table[]的区别 lua中的table可以定义为如下格式 local tab = { ["one"] = 1, ["two"] = 2 ...

  7. lua中table的常用方法

    转载:https://blog.csdn.net/Fenglele_Fans/article/details/83627021 1:table.sort() language = {"lua ...

  8. lua的table库中的常用函数总结

    table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下:  (1).table 是一个"关联数组",数组的索引可以是数字或者是字符串;  (2).tab ...

  9. 如何打印出lua里table的内容

    不像开发as3时用fb有强大的断点调试功能,一般lua开发不用什么高级的ide,貌似也没有适合的,就直接用sublime.exvim等文本编辑器,直接编译运行看结果.所以不能很方便的知道变量值,特别是 ...

最新文章

  1. 噪声标签的负训练:ICCV2019论文解析
  2. Linux系统端口聚合技术bonding
  3. nrf52840 gpiote如何配置中断输入_STM32第四章外部中断管理
  4. oshi.systeminfo 获取cpu的数量_CPU 的基础知识
  5. linux中登录p4后,linux下perforce(p4)的使用方法和命令
  6. shell执行perl_【编程技巧(一)】在Perl、Shell和Python中传参与输出帮助文档
  7. python 遍历文件夹
  8. Android:Android SDK的下载与安装
  9. html color 转换,Color颜色转换的三种方式(c#)
  10. git配置ssh秘钥(公钥以及私钥)windows
  11. MATLAB数学建模教学 | 史上最强的MATLAB学习网站,你需要的这里统统都有!!!
  12. android x5全屏白色,x5webview 自定义全屏界面
  13. 修改文件 火车票买下铺_为什么坐火车时,尽量不要买下铺?过来人用亲身经历告诉你原因...
  14. 前端面试题整理(一)
  15. Rhino6.9软件安装教程|兼容WIN10
  16. 像素三国志在线html5小游戏,激萌三国志H5
  17. python-scikit-learn基础
  18. 进化三部曲,从互联网大脑发育看产业互联网的未来
  19. 什么是OSI模型,OSI模型各层的是什么?OSI模型各层的作用是什么?
  20. 【洛谷 P1710】地铁涨价(dfs+bfs)

热门文章

  1. 怎样手动删除系统服务项
  2. 利用第三方后期处理材质(PostProcess Material)对物体进行描边【UE4】【C++】
  3. 迷你世界电路计算机的过程,迷你世界电路定时器教程 电路定时器怎么做
  4. mac电脑如何转换图片格式及修改大小?
  5. “都叫兽”背后的韩国文化
  6. utrack调试 艾肯icon_Icon Utrack 设置调试以及常用软件设置[超详细]
  7. GoSurf真是奇怪啊。
  8. 【洛谷 P3403】跳楼机(SPFA)
  9. @高职升本考生注意|天津招考资讯网大改版啦!!
  10. 香!好用图源!ArcGIS、QGIS、奥维、图新...都能免费调用的高清亚米级图源