//遍历lua表,index为表在栈中的位置
void traverse_table(lua_State* L, int index)
{
lua_pushnil(L);
stack_dump(L);
while (lua_next(L, index))
{
//拷贝一个临时key到栈顶
lua_pushvalue(L, -2);
const char* key = lua_tostring(L, -1);
const char* value = lua_tostring(L, -2);
//std::cout << "key is:" << key << " value is:" << value << std::endl;
printf("key is:%s,value is:%s\n", key, value);
//删除临时key和value
lua_pop(L, 2);
}
stack_dump(L);
}

其中lua_next会把表中的每一个键值对压入到栈上,

用 lua_pushvalue(L, -2);的目的是为了搞一个临时key,不对key直接进行tostring,原因不太了解,参考手册中描述如下:
打印栈中元素(从栈底开始)
void stack_dump(lua_State* L){
printf("\n------ stack dump begin ------\n");
for (int i = 1; i <= lua_gettop(L); ++i){
int t = lua_type(L, i);
switch (t){
case LUA_TNONE:{
printf("LUA_TNONE\n");
}break; case LUA_TNIL:{
printf("LUA_TNIL\n");
}break; case LUA_TBOOLEAN:{
printf("LUA_TBOOLEAN : %s\n", lua_toboolean(L, i) ? "true" : "false");
}break; case LUA_TLIGHTUSERDATA:{
printf("LUA_TLIGHTUSERDATA\n");
}break; case LUA_TNUMBER:{
//整形
if (lua_isinteger(L, i)){
printf("LUA_TNUMBER integer : %lld \n", lua_tointeger(L, i));
}
else if (lua_isnumber(L, i)){
printf("LUA_TNUMBER number: %g\n", lua_tonumber(L, i));
}
}break; case LUA_TSTRING:{
printf("LUA_TSTRING : %s\n", lua_tostring(L, i));
}break; case LUA_TTABLE:{
printf("LUA_TTABLE\n");
}break; case LUA_TFUNCTION:{
printf("LUA_TFUNCTION\n");
}break; case LUA_TUSERDATA:{
printf("LUA_TUSERDATA\n");
}break; case LUA_TTHREAD:{
printf("LUA_TTHREAD\n");
}break; case LUA_NUMTAGS:{
printf("LUA_NUMTAGS\n");
}break; default:{
printf("%s\n", lua_typename(L, t));
}break;
}
} std::cout << "------ stack dump end ------" << std::endl;
}




c中遍历lua的表的更多相关文章

  1. lua中遍历table的几种方式比较

    当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...

  2. C中调用LUA回调(LUA注册表)

    实现原理: 通过将LUA中得回调函数存入LUA注册表中来保存LUA函数,然后在需要回调时从LUA注册表中取出LUA函数进行调用 下面是一些预备知识:(学习两个重要的函数) 原汁原味的英文解释的最透彻, ...

  3. redis中使用lua脚本

    lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...

  4. Lua 学习之基础篇四<Lua table(表)>

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...

  5. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  6. Lua查找表元素过程(元表、__index方法是如何工作的)

    近日开始研究Lua,在元表的使用上照猫画虎地搞了两下,实现了“面向对象”,但究其本质却略有不解,后咨询牛哥得解,特此记录. Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Val ...

  7. 在 Django 模板中遍历复杂数据结构的关键是句点字符

    在 Django 模板中遍历复杂数据结构的关键是句点字符 ( . ). 实例二 mysit/templates/myhtml2.html修改如下 <!DOCTYPE html> <h ...

  8. C中调用Lua函数

    我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglob ...

  9. SLua 中使用 Lua 5.3 的编译工程

    2016-03-05 更新: 之前编译的库,在 Android 下 Lua_Number 和 Lua_Integer 被编译为了32位,导致从 C# 到 Lua 过程中有64位到32位整型转换会出现溢 ...

  10. lua table表

    lua table表 语法结构 创建一个 table 直接使用 "{}" 即可 table1 = {} -- 赋值 table1["name"] = " ...

随机推荐

  1. Hadoop搭建超级详解

    html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...

  2. 应用kafka的经验

    Kafka 部署注意事项? 启动用户,非root 安装目录权限:除了数据目录和日志目录是读写外,bin目录是可执行,其他目录应该只读 默认端口修改 只容许内网访问 集成监控和管理软件 开启认证 Kaf ...

  3. Software_programming_Config_HOCON

    05:09:37 HOCON github https://github.com/lightbend/config/blob/master/HOCON.md 相较于 XML, JSON, YAML 更 ...

  4. Visual Studio Code 如何设置成中文语言

    Visual Studio Code 是一款微软的代码编辑器,这款软件是比较不错的,用起来也比较方便,但是好多人在第一次安装的时候展现的是英文的,这对于一些小伙伴是比较头疼的问题,那如何调整为中文的呢 ...

  5. 多个if...else和switch...case语句的区别和分析

    1.场景: 当我们有一个判断条件的时候,显然用if语句比较方便有效. 但当判断条件很多的时候,我们可以使用if语句或者if....eles 语句和switch  case 语句. 2.如何选择 一般情 ...

  6. 使用EmguCV3.0.0调用摄像头并设置帧率

    此教程使用emgu3.0.0,其他版本兼容性未知. 转载请注明出处: http://www.cnblogs.com/zaiyuzhong/p/open-camera-with-emgu3_0_0.ht ...

  7. 16.java八皇后问题

    问题描述:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即: 任意两个皇后都不能处于同一行 .同一列或同一斜线上,问有多少种摆法(92). 思路分析:1) 第一个皇后先放第一行第一列2) ...

  8. Java多线程编程技术方案原理

    一 ,多线程相关的一些概念 1,线程和进程: 线程指的是进程中一个单一顺序的控制流, 进程中可以并发多个线程,每条线程并行执行不同的任务,被认为是一个计算资源的集合.进程不能被任务是一个应用,因为有些 ...

  9. 杂:使用Shell判断文件换行符(LF/CRLF)

    前提:文件最后一行有换行符 第一步:以二进制方式取得文件最后两个byte.last2=`tail -c 2 <your_file> | od -x -A n` 第二步:判断最后两个byte ...

  10. ES6-Promise上

    一.Promise作用:解决回调地狱问题 transitionend是过渡结束事件,只要过渡结束就会触发: 回调地狱:指的是层层嵌套的回调函数,代码看起来非常晕 <!DOCTYPE html&g ...