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) {
    //这里省略了具体的类型  
    ....
    }
}
以上是个人的学习小计,如果有错误的地方,烦请指出,相互学习,互免!

lua_gettable详解

lua文件全局变量如下global = { { Level = 1, sid = monster }, { Level = 2, sid = man }}C文件取值代码lua_getglob...
  • scarin
  • scarin
  • 2013年12月20日 16:57
  • 1114

lua table操作实例详解 lua_gettable

lua table操作实例详解 lua_gettable lua_getglobal(L, "mytable") lua_pushnumber(L, 1)        lua_g...
  • linuxheik
  • linuxheik
  • 2014年01月22日 14:14
  • 3312

lua堆栈

首先了解下c++与lua之间的通信: 假设在一个lua文件中有如下定义 -- hello.lua 文件 myName = "beauty girl" 请注意红色数字,代表通信顺序: 1)...
  • perfect2011
  • perfect2011
  • 2014年02月14日 15:03
  • 7716

lua笔记

1.lua_gettablevoid lua_gettable (lua_State *L, int index); 把t[k] 值压入堆栈,这里的 t 是指有效索引 index 指向的值,而 k ...
  • keep_moving_cqu
  • keep_moving_cqu
  • 2016年03月10日 09:30
  • 1190

lua与C/C++交互table(lua_gettble)

引用http://blog.csdn.net/yanjun_1982/article/details/7596171 今天上班的时候和程序对一个功能的程序接口,需求是这样的:脚本代码根据配置...
  • csdehaolin
  • csdehaolin
  • 2015年04月18日 09:32
  • 1985

C/C++访问Lua中table元素方法总结

方式一: extern "C"{ #include #include #include }; #pragma comment(lib,"lua5.1.lib") int main() {  l...
  • zhangyulin54321
  • zhangyulin54321
  • 2013年10月16日 10:57
  • 4831

Lua常用方法分析

本文在拜读酸毛杏儿的《lua常用方法》一文后,写下此文。 Lua常用方法,本文一共讲解8个方法,依次如下: 1.lua_gettable lua_getglobal(L, "mytable") ...
  • yuxikuo_1
  • yuxikuo_1
  • 2016年08月09日 23:40
  • 374

lua学习笔记之详解lua堆栈

原文连接:http://blog.csdn.net/musicvs/article/details/8440707     1. Lua的堆栈和全局表 我们来简单解释一下Lua的堆栈和全局表,堆栈大...
  • yhhwatl
  • yhhwatl
  • 2013年07月11日 19:22
  • 7185

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

本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table。...
  • han1558249222
  • han1558249222
  • 2015年09月10日 00:10
  • 1886

lua table操作实例详解

lua table操作实例详解 lua_gettable lua_getglobal(L, "mytable") lua_pushnumber(L, 1)        lua_get...
  • rheostat
  • rheostat
  • 2013年12月09日 14:55
  • 3748
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:lua 中 lua_gettable的使用 C++ 调用lua 读取table
举报原因:
原因补充:

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