【第22期】观点:IT 行业加班,到底有没有价值?

Lua c api 互传字符串那些事(巧用toLua_tostring的api)

原创 2015年11月19日 18:36:39

               首先书接上一遍,上一遍说到我们可以在c中获取Lua传递过来的Table,然后通过栈的操作,获取table中的字符或者number.

   一切都那么的完美,所以我就把这段代码直接用于我们的工程中,构建,出包,安装,点击按钮,

   一切都很顺利了吗?然后,并没有!

      我发现,我在Lua中获取的table元素中的字符串全部消失了,而table中number元素的数据全部都在。这是为什么呢?

         我们都知道:当字符串正在被访问的时候不要将其出栈;永远不要修改字符串。

       所以我的栈都没有让字符串出栈,一直保留在栈内。

         看一下代码:

        

	//------------------------此时栈中的内容应该如下-------------------
	//    说明         栈内容          排序             排序

	//  栈低/栈顶      table           -1               1


	luaL_checktype(L, 1, LUA_TTABLE);//检查栈顶是否一个table

	lua_pushnumber(L, 1);//先向栈中压入一个数字  为何要压入一个数字呢?
 
	//------------------------此时栈中的内容应该如下-------------------
	//    说明         栈内容          排序             排序
	//    int            1             -1                2
	//    栈低         table           -2                1

	lua_gettable(L, -2);//获取table中的第一个元素value 并把这个value放到栈顶

	//------------------------此时栈中的内容应该如下-------------------
	//    说明         栈内容          排序             排序
	//    int          1007             -1                2
	//    栈低         table            -2                1


	if (lua_isnumber(L, 2)){  //再获取栈顶的1007 value

		int  luanumber = lua_tonumber(L, 2);

		CCLOG("luanumber = %d", luanumber);
	}
	//然后出栈  这一步很重要,同样地我们也应该在上面多参数传递时,获取完栈顶数值之后,出栈,
	//让C语言保持多栈顶的控制,而不改变整个栈
	//把栈顶的数值弹出
	lua_pop(L, 1);

	//------------------------此时栈中的内容应该如下-------------------
	//    说明         栈内容          排序             排序
	
	//    栈低         table            -1                1

    //得到这个原始干净的栈之后 就会继续获取下面的值
	lua_pushnumber(L, 2);
	lua_gettable(L, -2);
	if (lua_isstring(L, -1)){
		std::string luastring = lua_tostring(L, -1);
		const char* numberA = luastring.c_str();
		CCLOG("numberA = %s", numberA);
	}
	lua_pop(L, 1);

	//同理可以得到
	lua_pushnumber(L, 3);
	lua_gettable(L, -2);
	if (lua_isstring(L, -1)){
		std::string luastring = lua_tostring(L, -1);
		const char* numberB = luastring.c_str();
		CCLOG("numberA = %s", numberB);
	}
        CCLOG("---->roleid = %s", lualog);
        <pre name="code" class="java">	CCLOG("---->roleid = %s", lualog);
	CCLOG("---->money = %d", money);
	CCLOG("---->productName = %s", productName);
	CCLOG("---->callBackStr = %s", callBackStr);
	CCLOG("---->gameGold = %s", gameGold);
	CCLOG("---->rate = %d", rate);




         在最后的log输出,你会发现,所有的字符串的输出都是错乱的。

         这是为什么呢??没有办法,我只好进行调试了,VS2013的F5按一下。

          

          一步by一步运行下去,然后你会发现。

          首先,我们先看roleid这个字段。

          

          注意看黄色的标志箭头。(按行来进行调试)

          运行完luastring.c_str之后,lualog的内存地址上的值为1008。

          接着,

          

         跳出if之后,什么鬼lualog的值被改变了?变为空字符串了? 怎么可能?

         我就想,是不是luastring的值改变,导致指针指向的值也不存在了。

         接着我调试一次,把所有有关的内存地址和指针都捕捉一下。

         然后,惊人地发现

     其实luastring的值其实没有变的,变的是字符串指针指向。既然,本来传递的值没有改变,那么如何把这个值取下来,运用到后面的方法中去呢?

      这个时候,就需要查看源码了,我相信,lua与C的交互中一定存在同样的需求,传递字符串,那么他们api中是如何取得字符串的值呢?

      我翻看了C api中的这个文件:lua_cocos2dx_network_manual.cpp

      里面有这样的方法:

      

        看到没有,他们是使用tolua_tostring来取值字符串的值的,取值之后,把值运用到其他C方法中。

        看到这里就可以了,把上面方法中所有通过lua_tostring方法获取字符串的函数改为tolua_tostring。

        完美解决。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Lua数据类型转换

Lua提供了类型转换函数,这些转换函数包括:转换成数字和转换成字符串等。1.转换成字符串tostring()可以将布尔类型和数值类型转换为字符串类型,示例:local bVar = false; pr...

lua table to string,string to table

--[[serialize.lua 声明序列化接口,并提供serialize和unserialize函数用于对Table对象进行序列化和反序列化操作 Exported API: Exam...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Lua C api 中让人头痛的栈与table传递

在Lua对C的api中有两个知识点非常重要,而且这两个知识点也是很容易导致程序出错。 1.栈的使用     其中要先看明白以下这篇参考文章:     Lua推栈          以上已经好明确的...

Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)

--[[ file name : table序列化和反序列化的问题.lua author : Clark/陈泽丹 created : 2011-12-22 ...

Lua学习笔记1

今天上班的时候和程序对一个功能的程序接口,需求是这样的:脚本代码根据配置文件生成一组中奖信息,用table来保存,然后将这个table传给程序接口,程序根据这个table中的数据向玩家显示中奖界面。很...

LUA与C++交互第一篇

到公司已经两个周了,学习Lua已经开始在项目中使用,但是由于使用的lua函数基本上都是公司在上面进行了一次封装的,没有源代码对两种语言的交互详情还是不甚了解。如:如果向LUA注册一个对象给LUA使用,...

和我一起写lua - C和lua的参数传递与返回值

lua通过一个运行时栈来维护参数传递及返回,使用lua_to*等函数获取lua传递到C函数的参数,使用lua_push*从C函数返回值到lua脚本。此外也可以使用lua_getglobal从C函数获取...

cocos2dx-lua的spine局部换装

首先我要说的是,别纠结了,只能自己加 这里涉及到简单的lua-binding 项目->frameworks->cocos2d-x->cocos->scripting->lua-bindings->au...

cocos2dx中使用的tolua关于字符串处理的一个问题

在使用cocos2dx的tolua binding的过程中发现一个问题,如果返回或者输入是std::string的时候不允许包含二进制数据,而std::string是允许的,这样一来就造成了一个使用上...

Lua C API 研究 —— 基础篇

对 Lua C API 进行基础的介绍 总结了 C 调用 Lua 函数的栈操作过程 总结了 Lua 调用 C 函数的栈操作过程 总结了 Lua 加载 C 链接库的过程
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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