转自:http://hi.baidu.com/bitbull/blog/item/bc27581eca1886f61bd5768e.html
问题概要: 用lua写了个函数,返回的是一个表.需要在C里对返回的表里元素做二次处理.
在C里我们可以通过lua_gettable()或者lua_rawget()来获取表里元素值,但使用这两个接口的前提是你得知道key,它才能给你value. 当然对于顺序下标倒无所谓,但恰巧这次我用到的是关联数组,下标是无规则字符串.这时候如何遍历出表里元素就是个问题.
lua_next()就成了比较合适的选择.画了下图对整个逻辑做了解释
![](https://i-blog.csdnimg.cn/blog_migrate/835984b08844c2dd2e33868a9e3c9205.jpeg)
上图对简单的表遍历做了介绍, 但事实上的情况是我返回了一个二维表,如果你了解了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返回值
附加例子
在C中遍历脚本中的table主要是通过lua c api lua_next来完成
具体实践如下:
代码如下:
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int table_next(lua_State *L, int i,char **k, char **v)
{
<wbr><wbr><wbr><wbr><wbr><wbr><wbr> if ( lua_next(L, i) !=0 )<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> *k = (char *)lua_tostring(L, -2);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> *v = (char *)lua_tostring(L, -1);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_pop(L, 1);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return 1;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> else<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return 0;<br> }<br><br> int main(void)<br> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_State *L;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> int t_idx;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> char *k= NULL;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> char *v= NULL;<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> L = lua_open();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> luaL_openlibs(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> luaL_loadfile(L, "luatest.lua");<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_pcall(L,0,0,0);<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_getglobal(L,"testtab");<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> t_idx = lua_gettop(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_pushnil(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> while( table_next(L,1,&k,&v) != 0)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> fprintf(stderr, "k[%s]-v[%s]\n",k,v);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_close(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return 1;<br> }<br> 脚本代码为:<br> [opensource@localhost ppt]$ cat luatest.lua<br> testtab={<br> MsgCode = "1",<br> Host = "127.0.0.1",<br> abc = "test",<br> id=100,<br> }<br> print("ok")<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
具体实践如下:
代码如下:
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int table_next(lua_State *L, int i,char **k, char **v)
{
<wbr><wbr><wbr><wbr><wbr><wbr><wbr> if ( lua_next(L, i) !=0 )<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> *k = (char *)lua_tostring(L, -2);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> *v = (char *)lua_tostring(L, -1);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_pop(L, 1);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return 1;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> else<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return 0;<br> }<br><br> int main(void)<br> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_State *L;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> int t_idx;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> char *k= NULL;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> char *v= NULL;<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> L = lua_open();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> luaL_openlibs(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> luaL_loadfile(L, "luatest.lua");<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_pcall(L,0,0,0);<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_getglobal(L,"testtab");<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> t_idx = lua_gettop(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_pushnil(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> while( table_next(L,1,&k,&v) != 0)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> fprintf(stderr, "k[%s]-v[%s]\n",k,v);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> lua_close(L);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return 1;<br> }<br> 脚本代码为:<br> [opensource@localhost ppt]$ cat luatest.lua<br> testtab={<br> MsgCode = "1",<br> Host = "127.0.0.1",<br> abc = "test",<br> id=100,<br> }<br> print("ok")<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>