`
helloyesyes
  • 浏览: 1305996 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

使用lua_next()遍历表

阅读更多

问题概要: 用lua写了个函数,返回的是一个表.需要在C里对返回的表里元素做二次处理.

在C里我们可以通过lua_gettable()或者lua_rawget()来获取表里元素值,但使用这两个接口的前提是你得知道key,它才能给你value. 当然对于顺序下标倒无所谓,但恰巧这次我用到的是关联数组,下标是无规则字符串.这时候如何遍历出表里元素就是个问题.

lua_next()就成了比较合适的选择.画了下图对整个逻辑做了解释

上图对简单的表遍历做了介绍, 但事实上的情况是我返回了一个二维表,如果你了解了lua_next()的处理过程,那下面的代码看起来就没什么问题了.

t_idx = lua_gettop(L);

lua_pushnil(L);

while (lua_next(L, t_idx))

{

printf("============================\n");

it_idx = lua_gettop(L);

lua_pushnil(L);

while(lua_next(L, it_idx))

{

printf("%s\n", lua_tostring(L, -1));

lua_pop(L, 1);

}

lua_pop(L, 1);

}

本文仅起个抛砖引玉的作用, 实际上lua的栈逻辑基本就是这样.其他接口的调用方式也很类似.

1.参数压栈

2.call 函数

3.返回值位于栈顶

4.pop返回值

分享到:
评论

相关推荐

    lua_test.rar_C++_c# lua_c++ lua_lua_lua调用C++

    本示例中的"lua_test.rar"文件集是一个关于C++与Lua交互的实践案例,主要探讨了如何通过Lua脚本调用C++编写的函数。下面我们将详细探讨这个主题。 首先,Lua是一种轻量级的脚本语言,它简洁、易学,常被用于游戏...

    Lua跟C之间交互Table

    // lua_next() 会使用栈顶元素作为Key去定位本次需要取出Table里面的那个值对 // 如果Key=nil, 那就表示本次取出的是第一个元素 // 它会先将当前的这个Key弹出,然后将本次取出的Key/Value压入栈, Value在栈顶 // 一...

    C语言头文件 LUA_C

    C语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 LUA_CC语言头文件 ...

    ngx_lua_module-windows-1.1.2.0

    CSDN(Chinese Software Developer Network)是一个中国程序员的交流平台,这里可能有丰富的技术文章和讨论,帮助你深入理解和使用ngx_lua_module。 6. **最佳实践** - 将复杂逻辑移出主Nginx配置,放入Lua脚本,...

    lua_tinker支持最新Lua5.2

    Lua_tinker是一个针对Lua语言的C++接口库,它的主要目标是简化Lua与C++之间的交互,让开发者能够更方便地在C++程序中嵌入和使用Lua脚本。随着Lua 5.2版本的发布,lua_tinker也进行了更新以支持这个新版本的特性,这...

    lua_code.zip_Lua嵌入_exe-hreader_lua_lua c_lua c++

    如果发生错误,可以使用`lua_tostring()`获取错误信息。 7. **关闭Lua状态机**:当不再需要Lua环境时,记得调用`lua_close()`来释放资源。 在"exe-hreader"上下文中,可能是将Lua用于实现程序的用户界面或配置文件...

    lua_c_lua_c

    4. **数据类型转换**: Lua和C的数据类型不同,所以需要使用`lua_tonumber`、`lua_tostring`等函数将Lua值转换为C类型,反之亦然。 5. **错误处理**: 在C与Lua交互时,理解并处理错误至关重要。`lua_gettop`、`lua_...

    Test_Lua.rar_VS2010_VS2010 Lua_VS2010调用LUA脚本基础_lua_lua脚本

    6. **错误处理**:在调用lua_pcall时,可能出现错误,需要检查其返回值并使用lua_gettop和lua_tostring获取错误信息。 7. **使用tolua++或tolua**:为了简化C++与Lua之间的交互,可以使用tolua++或tolua这样的绑定...

    ngx_lua_waf-master.zip_lua_nearly11h_nginx_ngx_lua_waf

    ngx_lua_waf使用Lua编写,可以实现动态规则检查、请求参数过滤、IP黑白名单管理等功能,有效防止恶意用户对Web应用的入侵。 在ngx_lua_waf项目中,你可能会找到以下组件和文件: 1. `conf`目录:包含Nginx配置文件...

    use_Lua.rar_c++ lua_lua_lua C++ 嵌入_lua vc

    7. **清理工作**:在程序结束前,别忘了使用`lua_close()`关闭Lua状态机,释放资源。 Lua的灵活性在于它的轻量级和强大的元表机制,使得在C++中定义复杂的数据结构和行为变得容易。例如,通过元表,你可以模拟出...

    lua_cjson_2.1.0

    在安装和使用lua_cjson时,你需要确保你的开发环境是VS2013,因为这个版本的lua_cjson已经过测试,可以在该环境中完美编译。Visual Studio 2013是一个强大的IDE,支持C++项目开发,可以为lua_cjson提供一个良好的...

    lua_add调用

    "lua_add调用"涉及到的是使用C++在Visual Studio 2012环境下与Lua交互,实现一个简单的加法功能。这个过程主要包括以下几个关键知识点: 1. **Lua API**:Lua提供了C接口,允许C或C++程序调用Lua函数,反之亦然。在...

    android ndk lua5.1.5 (加入了lua_cjson)

    6. **在Java代码中调用**:最后,在Java代码中,你可以使用`System.loadLibrary("lua")`和`System.loadLibrary("lua_cjson")`来加载这两个库,并通过JNI接口调用Lua和lua_cjson的功能。 通过以上步骤,你就成功地在...

    cjson.rar_LUA JSON_cjson_cjson.lua_lua_piledxg

    例如,`local json_data = '{"name":"John", "age":30}'`,可以使用`local lua_table = cjson.decode(json_data)`将其解析为Lua表。 3. **序列化Lua到JSON**:`cjson.encode()`函数用于将Lua表转换为JSON字符串。这...

    luadump_lua_zip_

    而"luadump_lua_zip_"则可能是一个专门针对Lua 4版本的反编译工具,帮助开发者分析和理解Lua代码的内部结构。本文将详细介绍Lua语言的基础特性,以及如何利用luadump工具进行反编译,同时探讨Zip文件格式及其在Lua...

    Lua_C 实现Lua与C API互调

    要使用Lua_C,你需要包含lua.h头文件,并链接lua.lib库到你的项目中。 在Visual Studio 2008中,创建一个新的C或C++项目,然后添加对lua源码库的支持。通常,lua源码会包含lua.c和lua.h,你可以在项目设置中将它们...

    lua_svr.rar_c++ lua_lua_lua c++_lua socket_服务器lua

    这可以通过限制Lua的API访问,使用安全的Lua环境,以及在C++与Lua交互时进行错误检查来实现。 此外,Lua的错误处理机制和调试工具也是关键。Lua提供了`pcall`函数来捕获和处理运行时错误,而`debug`库则可以用于...

    lua_tinker 非常好用的lua的简单封装

    在压缩包文件名称“lua_tinker-master”中,"master"通常指的是Git仓库的主分支,这表明这个库可能是从一个开源的Git仓库中获取的,其中包含了最新的稳定版本。通常,这样的文件夹会包含源代码、编译文件、示例、...

    lua_stm32f4.rar_lua stm32_lua移植stm32_stm32 lua_stm32f407移植lua_st

    在嵌入式系统领域,为了提高代码的可读性、可维护性和灵活性,越来越多的开发者选择使用高级脚本语言,如Lua,来替代传统的C/C++编程。本文将详细探讨如何在STM32F407微控制器上移植并运行Lua,以及实现一些基本功能...

    lua-5.3.5_Win32_dll16_lib_lua_

    - **交互数据**:使用`lua_push*()`和`lua_get*()`系列函数在C和Lua之间传递数据,如数值、字符串、表等。 - **错误处理**:使用`lua_error()`和`luaL_error()`处理Lua执行过程中的错误。 - **垃圾回收**:理解Lua的...

Global site tag (gtag.js) - Google Analytics