lua 中 lua_gettable的使用 C++ 调用lua 读取table

原创 2015年11月17日 17:41:53

  尝试着从C中读取lua中的table。 lua中提供lua_gettable 的C接口。例如我们要从a.lua中读取一个全局变量 background

--=================
-- file name :a.lua
--================

background = {r=0,g=0,b=255}

先写一个读取table值的接口

void getRGBValue(lua_State *L,const char *fname,int *r,int *g,int *b)
{
	//加载lua文件,并执行
	if (luaL_loadfile(L,fname) || lua_pcall(L,0,0,0) )
	{
		luaL_error(L,"cannot run config.file: %s",lua_tostring(L,-1));
		return;

	}
	//读取background table,并将background对象压栈
	lua_getglobal(L,"background");
	//判断是否是table类型
	if (!lua_istable(L,-1))
	{
		luaL_error(L,"'background is not a table'");
		return;
	}

	//获取颜色值
	*r =  getField(L,"r") ;
	*g =  getField(L,"g") ;
	*b =  getField(L,"b");
}

这边主要做的事情是读取lua文件,获取background对象,并压栈,然后调用getField接口取出table中各元素的值,getField是自己实现的接口,并非lua提供的C API

下面是getField的实现

int getField(lua_State *L,const char* name)
{
	//  将key 压栈,
	lua_pushstring(L,name);
	//gettable接口会根据栈顶的key索引,取出key对应的值,
	//将值压栈,这个时候栈顶的key被value覆盖,上面压了key进来,所以table目前的位置是-2的位置
	lua_gettable(L,-2);

	//类型检查
	if (!lua_isnumber(L,-1))
	{
		luaL_error(L,"attempt to call a not number value");
		return 0;
	}

	//转换成整形
	int result = lua_tonumber(L,-1);

	//将栈顶的元素出栈,还原成调用前的栈,以便下一次调用
	lua_pop(L,1);
	
	return result;
}


执行getField前,栈里只有table,如图

执行getField 首先第一步 执行lua_pushstring(L,name); 将key值入栈,这个时候栈顶的元素就是key

接下来执行 lua_gettable(L,-2),因为栈顶是key,所以table的位置是在倒数第二的位置,也就是-2的位置,执行gettable,这个接口会根据栈顶的key值取出key对应的background中的值,也就是background[key] 的值,放入栈顶,覆盖原来的key


将这个转换成我们想要的类型,然后执行lua_pop(L,1); 谈出栈的一个元素,也就是栈顶,value出栈,这个时候栈就变成了原来的样子以确保下次调用的时候table原始样

以上就是我对lua_gettable 的理解,是否是这样,其实可以通过lua_gettop 获取栈的元素,然后遍历这些元素,获取他们的类型去验证一下

具体的验证方法大概是这样的

int nNum = lua_gettop(L);
for (int i = 1; i <= nTop; ++i){
    int nType = lua_type(L,i);
    switch(nType) {
    //这里省略了具体的类型  
    ....
    }
}
以上是个人的学习小计,如果有错误的地方,烦请指出,相互学习,互免!

相关文章推荐

C/C++代码里面读取Lua的Table

本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table。...

C++对Lua中table进行读取、修改和创建

C++对Lua中table进行读取、修改和创建

c++下 遍历 lua table

前不久在网上看到一段代码,功能是遍历lua的table。当然也可以衍生成 lua table向c++中的map的转化。直接上代码,仅供同学们参考。(注:这代段代码是网上的 非本人所写 仅供学习)//C...

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C++排序算法测试  Lua解释器的排序算法在LDT下,运行速度...

C++调用Lua读取配置文件的一个简单例子

首先顶一个Lua的处理类 #ifndef _LUA_HANDLER_H_ #define _LUA_HANDLER_H_ extern "C" { #include #include #incl...

Quick-Cocos2d-x 2.26 使用tolua工具导出C++的类给Lua调用WINDOWS篇

版本:Quick-Cocos2d-x 2.26 Release 参考:http://www.cnblogs.com/vokie/p/3816324.html 这篇博文 给了详细的操作,配有图,推荐...

cocos2dx中注册导出c++函数供lua调用(使用tolua++)

弄了半天终于搞定了,网上有很多相似的帖子,但可能由于我基础不好,总是出错,最后搞定了。 参考http://www.cnblogs.com/mrblue/archive/2013/06/08/31269...

如何使用cocos的自动绑定工具实现lua调用c++的类

本文介绍利用cocos2dx自带的自动绑定工具,注册自己的自定义类和函数,并说明部分错误出现的原因和解决方案。将生成的绑定类导入到自己的lua项目中,从而实现lua调用自己自定义类的目的...
  • flt120b
  • flt120b
  • 2017年07月24日 17:50
  • 129

vs项目中使用c++调用lua5.1

http://blog.csdn.net/wangbin_jxust/article/details/37557935 一、创建项目 同样在该解决方案中,右键解决方案->添加项目-...

使用tolua++实现C++与LUA相互调用

代码下载:LUA=CPP.zip[1845K] LUA是一种目前很流行的高效精简的脚本语言。LUA一个特点是比较方便的与C通讯。 然而要在脚本中使用C++类使用基本的LUA方法还是比较麻烦...
  • wfziyou
  • wfziyou
  • 2013年10月09日 11:32
  • 576
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:lua 中 lua_gettable的使用 C++ 调用lua 读取table
举报原因:
原因补充:

(最多只允许输入30个字)