﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-colorful-随笔分类-lua</title><link>http://www.cppblog.com/colorful/category/19902.html</link><description>zc qq:1337220912</description><language>zh-cn</language><lastBuildDate>Mon, 02 Mar 2015 22:16:29 GMT</lastBuildDate><pubDate>Mon, 02 Mar 2015 22:16:29 GMT</pubDate><ttl>60</ttl><item><title>qcjl lua project log</title><link>http://www.cppblog.com/colorful/archive/2015/03/01/209893.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sun, 01 Mar 2015 03:55:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2015/03/01/209893.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/209893.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2015/03/01/209893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/209893.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/209893.html</trackback:ping><description><![CDATA[2015/3/1<br />protoc-gen-lua 生成的lua又发现新的问题, main function has more than 200 local variables问题，网上搜索了一下，有相应的解决方法，据说还会有一个新的问题出来：不能用 repeated submessage,&nbsp; 建议用云风的pbc. 所以方案改为用云风的pbc<img src ="http://www.cppblog.com/colorful/aggbug/209893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2015-03-01 11:55 <a href="http://www.cppblog.com/colorful/archive/2015/03/01/209893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cocos2dx lua protobuf</title><link>http://www.cppblog.com/colorful/archive/2015/02/12/209802.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 12 Feb 2015 03:42:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2015/02/12/209802.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/209802.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2015/02/12/209802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/209802.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/209802.html</trackback:ping><description><![CDATA[<div><div>http://blog.csdn.net/weyson/article/details/17024325</div><div>http://www.cppblog.com/colorful/archive/2015/01/17/209557.html</div><div>http://blog.csdn.net/w00w12l/article/details/39316321</div><br />protoc-gen-lua下载地址: <em><strong><a href="https://github.com/sean-lin/protoc-gen-lua" target="_blank"><span style="color:#0000FF;"></span></a></strong><a href="https://github.com/sean-lin/protoc-gen-lua" target="_blank"><span style="color:#0000FF;"></span></a></em><a href="https://github.com/sean-lin/protoc-gen-lua" target="_blank"><span style="color: #0000ff;">https://github.com/sean-lin/protoc-gen-lua</span></a><br /><br />1/ 先到protobuf的python目录下执行<br />&nbsp;&nbsp;&nbsp; python setup.py build<br />&nbsp;&nbsp;&nbsp; python setup.py install<br /><br />2/ 在protoc-gen-lua的plugin目录中新建protoc-gen-lua.bat, 内容如下:<br />@python 目录\protoc-gen-lua\plugin\protoc-gen-lua<br /><br />3/ 用protoc把proto文件生成lua文件<br />&nbsp; protoc --lua_out=./ --plugin=protoc-gen-lua="目录\protoc-gen-lua.bat"&nbsp; test.proto<br /><br />4/ 将protoc-gen-lua/protobuf下的pb.c 放到工程的Classes下, 并加入到c++工程中<br /><br />5/ 将protoc-gen-lua/protobuf上的所有lua文件放到工程的src目录(lua目录)下<br /><br />6/ AppDelegate.cpp 添加代码<br />extern "C"{<br />&nbsp;&nbsp;&nbsp; int luaopen_pb(lua_State* L);<br />}<br />在applicationDidFinishLaunching()中调用 luaopen_pb(state);<br /><br />---------------------------------------------------------------------------<br /><div>&nbsp;&nbsp;&nbsp; require "src/xy/person_pb" &nbsp;<br />&nbsp;&nbsp;&nbsp; local msg = person_pb.Person() &nbsp;<br />&nbsp;&nbsp;&nbsp; msg.id = 100&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; msg.name = "foo"&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; msg.email = "bar"&nbsp; &nbsp;<br /><br />&nbsp;&nbsp;&nbsp; local pb_data = msg:SerializeToString()&nbsp; -- Parse Example &nbsp;<br />&nbsp;&nbsp;&nbsp; print("create:", msg.id, msg.name, msg.email, pb_data) &nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp; local msg = person_pb.Person()&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; msg:ParseFromString(pb_data)&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; print("parser:", msg.id, msg.name, msg.email, pb_data)</div><br />---------------------------------------------------------------------------<br />移植到android 记得将pb.c添加到proj.android\jni\Android.mk中<br /><br />&nbsp;</div><img src ="http://www.cppblog.com/colorful/aggbug/209802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2015-02-12 11:42 <a href="http://www.cppblog.com/colorful/archive/2015/02/12/209802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quick-Cocos2d-x 集成 Google protobuf 方法</title><link>http://www.cppblog.com/colorful/archive/2015/01/17/209557.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 17 Jan 2015 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2015/01/17/209557.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/209557.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2015/01/17/209557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/209557.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/209557.html</trackback:ping><description><![CDATA[<div>http://cn.cocos2d-x.org/tutorial/show?id=506</div><br /><div><div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	本文将向您介绍Quick-Cocos2d-x集成google protobuf的方法。 &nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	<strong>第一步 &nbsp; 需要最新的protobuf 类库和解析程序。&nbsp;</strong>  </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	下载地址：<a href="https://github.com/sean-lin/protoc-gen-lua" target="_blank"><span style="color:#0000FF;">https://github.com/sean-lin/protoc-gen-lua</span></a>  </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	git clone&nbsp;<a href="https://github.com/sean-lin/protoc-gen-lua.git" target="_blank"><span style="color:#0000FF;">https://github.com/sean-lin/protoc-gen-lua.git</span></a>&nbsp;到任意的一个地方 </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	然后，可以得到重要的两个目录 </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	<span style="line-height:1.5;"> </span></p><div><div id="highlighter_782255"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">protoc-gen-lua/plugin/&nbsp; </code></div><div number2="" index1=""  alt1"=""><code plain"="">protoc-gen-lua/protobuf/</code></div></div></td></tr></tbody></table></div></div> &nbsp;  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	<strong>第二步， 需要使用protoc &#8212;lua_out=. 这种方法， 将我们自己的*.proto 的文件解析成lua文件</strong>  </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	plugin目录是提供将buffer 文件解析成lua 版本的类库， 需要python 支持。 &nbsp;如果已经编译了google 官方的protoc 那个程序， 只需要在系统PATH环境变量总追加plugin目录就好: </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_807689"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">export PATH={protoc-gen-lua DIR }/plugin:$PATH</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	关于protoc的编译另请google . </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	如果解析不出lua文件来， 可以手动志信一下plugin/protoc-gen-lua的程序， 他应该是+x 的权限(chmod +x plugin/protoc-gen-lua) </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	细节的安装步骤可以参考&nbsp;<a href="https://code.google.com/p/protoc-gen-lua/" target="_blank"><span style="color:#0000FF;">https://code.google.com/p/protoc-gen-lua/</span></a>  </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	<strong>第三步 ， 将protobuf 集成到quick 中</strong>  </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	protoc-gen-lua/protobuf/ 目录就是要编译到quick-cocos2d-x目录里面的部分。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	现在， 我们只需要 protoc-gen-lua/protobuf/pb.c 这个文件&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	先确定自己的quick-cocos2d-x lua扩展目录： </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_519328"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">/quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	所有lua 的c/c++现成扩展,都可以直接放到这里。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	将pb.c这个文件复制到 lua_extension目录下， 最好独立一个目录， 免得扩展多了乱。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	这是我的目录结构: </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_734895"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	然后开始修改扩展程序配置文件, lua_extensions.c </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	路径为： </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_466030"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	目前是一个不足60行的小文件， 我打算全部贴进来： </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_924060"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div><div number18="" index17=""  alt1"="">18</div><div number19="" index18=""  alt2"="">19</div><div number20="" index19=""  alt1"="">20</div><div number21="" index20=""  alt2"="">21</div><div number22="" index21=""  alt1"="">22</div><div number23="" index22=""  alt2"="">23</div><div number24="" index23=""  alt1"="">24</div><div number25="" index24=""  alt2"="">25</div><div number26="" index25=""  alt1"="">26</div><div number27="" index26=""  alt2"="">27</div><div number28="" index27=""  alt1"="">28</div><div number29="" index28=""  alt2"="">29</div><div number30="" index29=""  alt1"="">30</div><div number31="" index30=""  alt2"="">31</div><div number32="" index31=""  alt1"="">32</div><div number33="" index32=""  alt2"="">33</div><div number34="" index33=""  alt1"="">34</div><div number35="" index34=""  alt2"="">35</div><div number36="" index35=""  alt1"="">36</div><div number37="" index36=""  alt2"="">37</div><div number38="" index37=""  alt1"="">38</div><div number39="" index38=""  alt2"="">39</div><div number40="" index39=""  alt1"="">40</div><div number41="" index40=""  alt2"="">41</div><div number42="" index41=""  alt1"="">42</div><div number43="" index42=""  alt2"="">43</div><div number44="" index43=""  alt1"="">44</div><div number45="" index44=""  alt2"="">45</div><div number46="" index45=""  alt1"="">46</div><div number47="" index46=""  alt2"="">47</div><div number48="" index47=""  alt1"="">48</div><div number49="" index48=""  alt2"="">49</div><div number50="" index49=""  alt1"="">50</div><div number51="" index50=""  alt2"="">51</div><div number52="" index51=""  alt1"="">52</div><div number53="" index52=""  alt2"="">53</div><div number54="" index53=""  alt1"="">54</div><div number55="" index54=""  alt2"="">55</div><div number56="" index55=""  alt1"="">56</div><div number57="" index56=""  alt2"="">57</div><div number58="" index57=""  alt1"="">58</div><div number59="" index58=""  alt2"="">59</div><div number60="" index59=""  alt1"="">60</div><div number61="" index60=""  alt2"="">61</div><div number62="" index61=""  alt1"="">62</div><div number63="" index62=""  alt2"="">63</div><div number64="" index63=""  alt1"="">64</div><div number65="" index64=""  alt2"="">65</div><div number66="" index65=""  alt1"="">66</div><div number67="" index66=""  alt2"="">67</div><div number68="" index67=""  alt1"="">68</div><div number69="" index68=""  alt2"="">69</div><div number70="" index69=""  alt1"="">70</div></td><td><div><div number1="" index0=""  alt2"=""><code preprocessor"="">#include "lua_extensions.h"&nbsp; </code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code>&nbsp;</div><div number3="" index2=""  alt2"=""><code preprocessor"="">#if __cplusplus&nbsp; </code></div><div number4="" index3=""  alt1"=""><code keyword=""  bold"="">extern</code> <code string"="">"C"</code> <code plain"="">{&nbsp; </code></div><div number5="" index4=""  alt2"=""><code preprocessor"="">#endif&nbsp; </code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number7="" index6=""  alt2"=""><code comments"="">// cjson&nbsp; </code></div><div number8="" index7=""  alt1"=""><code preprocessor"="">#include "cjson/lua_cjson.h"&nbsp; </code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number11="" index10=""  alt2"=""><code comments"="">// zlib&nbsp; </code></div><div number12="" index11=""  alt1"=""><code preprocessor"="">#include "zlib/lua_zlib.h"&nbsp; </code></div><div number13="" index12=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number14="" index13=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number15="" index14=""  alt2"=""><code comments"="">// lpack&nbsp; </code></div><div number16="" index15=""  alt1"=""><code preprocessor"="">#include "lpack/lpack.h"&nbsp; </code></div><div number17="" index16=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number18="" index17=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number19="" index18=""  alt2"=""><code comments"="">// socket&nbsp; </code></div><div number20="" index19=""  alt1"=""><code preprocessor"="">#include "socket/luasocket.h"&nbsp; </code></div><div number21="" index20=""  alt2"=""><code preprocessor"="">#include "socket/mime.h"&nbsp; </code></div><div number22="" index21=""  alt1"=""><code preprocessor"="">#include "socket/socket_scripts.h"&nbsp; </code></div><div number23="" index22=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number24="" index23=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number25="" index24=""  alt2"=""><code comments"="">// filesystem&nbsp; </code></div><div number26="" index25=""  alt1"=""><code preprocessor"="">#include "filesystem/lfs.h"&nbsp; </code></div><div number27="" index26=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number28="" index27=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number29="" index28=""  alt2"=""><code comments"="">// lsqlite3&nbsp; </code></div><div number30="" index29=""  alt1"=""><code preprocessor"="">#include "lsqlite3/lsqlite3.h"&nbsp; </code></div><div number31="" index30=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number32="" index31=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number33="" index32=""  alt2"=""><code preprocessor"="">#include "protobuf/pb.c"&nbsp;&nbsp; //引用protobuf 库文件&nbsp; </code></div><div number34="" index33=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number35="" index34=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number36="" index35=""  alt1"=""><code keyword=""  bold"="">static</code> <code plain"="">luaL_Reg luax_exts[] = {&nbsp; </code></div><div number37="" index36=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code><code string"="">"cjson"</code><code plain"="">, luaopen_cjson_safe},&nbsp; </code></div><div number38="" index37=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code><code string"="">"zlib"</code><code plain"="">, luaopen_zlib},&nbsp; </code></div><div number39="" index38=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code><code string"="">"pack"</code><code plain"="">, luaopen_pack},&nbsp; </code></div><div number40="" index39=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code><code string"="">"socket.core"</code><code plain"="">, luaopen_socket_core},&nbsp; </code></div><div number41="" index40=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code><code string"="">"mime.core"</code><code plain"="">, luaopen_mime_core},&nbsp; </code></div><div number42="" index41=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code><code string"="">"lfs"</code><code plain"="">, luaopen_lfs},&nbsp; </code></div><div number43="" index42=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code><code string"="">"lsqlite3"</code><code plain"="">, luaopen_lsqlite3},&nbsp; </code></div><div number44="" index43=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{NULL, NULL}&nbsp; </code></div><div number45="" index44=""  alt2"=""><code plain"="">};&nbsp; </code></div><div number46="" index45=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number47="" index46=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number48="" index47=""  alt1"=""><code keyword=""  bold"="">void</code> <code plain"="">luaopen_lua_extensions(lua_State *L)&nbsp; </code></div><div number49="" index48=""  alt2"=""><code plain"="">{&nbsp; </code></div><div number50="" index49=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">// load extensions&nbsp; </code></div><div number51="" index50=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">luaL_Reg* lib = luax_exts;&nbsp; </code></div><div number52="" index51=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_getglobal(L, </code><code string"="">"package"</code><code plain"="">);&nbsp; </code></div><div number53="" index52=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_getfield(L, -1, </code><code string"="">"preload"</code><code plain"="">);&nbsp; </code></div><div number54="" index53=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">for</code> <code plain"="">(; lib-&gt;func; lib++)&nbsp; </code></div><div number55="" index54=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{&nbsp; </code></div><div number56="" index55=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushcfunction(L, lib-&gt;func);&nbsp; </code></div><div number57="" index56=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_setfield(L, -2, lib-&gt;name);&nbsp; </code></div><div number58="" index57=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">}&nbsp; </code></div><div number59="" index58=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pop(L, 2);&nbsp; </code></div><div number60="" index59=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number61="" index60=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number62="" index61=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">// load extensions script&nbsp; </code></div><div number63="" index62=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">luaopen_socket_scripts(L);&nbsp; </code></div><div number64="" index63=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">luaopen_pb(L);&nbsp;&nbsp; </code><code comments"="">//这是加入的protobuf 扩展注册名&nbsp; </code></div><div number65="" index64=""  alt2"=""><code plain"="">}&nbsp; </code></div><div number66="" index65=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number67="" index66=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number68="" index67=""  alt1"=""><code preprocessor"="">#if __cplusplus&nbsp; </code></div><div number69="" index68=""  alt2"=""><code plain"="">} </code><code comments"="">// extern "C"&nbsp; </code></div><div number70="" index69=""  alt1"=""><code preprocessor"="">#endif</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	至此 ， protobuf 扩展部分就算扩展完成了。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	确认是否成功支持 ， 可以在quick 项目最先被调用的lua文件中追加 require "pb" 做测试。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	*但这时候通过protoc 转码后得到的lua文件还不能被解析。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	<strong>第四步 从项目中包含protobuf的 lua库</strong>  </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	protoc-gen-lua/protobuf/这个目录下面， 还有大量的.lua文件， 是用来支持proto转码后的文件解析调用的。 不能少了这些文件。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	复制protoc-gen-lua/protobuf文件夹 到项目中 scripts目录下。 &nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	目录结构应该是这样的： </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_997850"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">[PROJECT]/scripts/protobuf/*.lua</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	然后， 需要告诉框架，从哪里可以引用到它。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	修改main.lua 在require("appxxxxxx") 上面 ， 加入下面的代码： </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_501035"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">package.path = package.path .. </code><code string"="">";./protobuf/?.lua;./scripts/protobuf/?.lua;"</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	这个方法， 能保证程序在被编译到手机之后仍然可以继续访问这个库。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	***千万别把转码的proto文件放到[PROJECT]/scripts/protobuf 目录里面.不信可以试试。 </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	现在， 项目支持protobuf 文件的解析了。 </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	<strong>第五步 &nbsp;重新编译player-x</strong>  </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	如果不习惯用player-x调试， 这个步骤不是必须的。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	进入player-x qt源码目录 ： </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_820149"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">cd quick-cocos2d-x/player/proj.qt</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	使用qmake 文件执行quick-x.pro 文件&nbsp; </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_314279"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">qmake ./quick-x.pro</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	继续： </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	make&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	等待结束， 将得到的quick-x-player文件，&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	放到：quick-cocos2d-x/player/bin/mac/ 目录下， 这样sublime text 装QuickXDev 扩展的直接可以用。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	**如果是mac os 10.9 系统， 可能编译不过去player-x程序。 我遇到了这个问题。&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	会提示错误 &nbsp;pb.c:28:10: fatal error: 'endian.h' file not found&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	如果错误信息相同， 修改文件: </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_874678"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	查找行: </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_715871"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code preprocessor"="">#include &lt;endian.h&gt;</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	临时变更为： </p> <p style="color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> </p><div><div id="highlighter_674497"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code preprocessor"="">#include &lt;machine/endian.h&gt;</code></div></div></td></tr></tbody></table></div></div>  <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp;&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	然后重新编译 player-x&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	make 就足够了&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	make </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	&nbsp; </div> <div style="margin:0px;padding:0px;color:#333333;font-family:'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;font-size:14px;background-color:#FFFFFF;"> 	**player-x 编译完毕后， 千万要将endian.h 引用改回原来的 #include &lt;endian.h&gt; ， 否则打包到手机的时候又回提示文件找不到了。&nbsp; </div></div><img src ="http://www.cppblog.com/colorful/aggbug/209557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2015-01-17 16:08 <a href="http://www.cppblog.com/colorful/archive/2015/01/17/209557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua注册回调到C++</title><link>http://www.cppblog.com/colorful/archive/2015/01/17/209553.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 17 Jan 2015 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2015/01/17/209553.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/209553.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2015/01/17/209553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/209553.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/209553.html</trackback:ping><description><![CDATA[<div>http://cn.cocos2d-x.org/tutorial/show?id=1896</div><br /><div><p><strong>思路</strong></p><p>像所有语言一样，绑定回调主要是执行的任务执行到特定情形的时候，调用对用回调方法。 本文也一样，Lua注册回调到C++的核心思路是，当C代码执行到特定特定情形的时候，调用Lua的方法。</p><p>我这里使用的是用lua_stack直接调用lua的方法，没有使用Cocos2d-x封装的那个dispatcher，因为熟悉那个格式太墨迹了。</p><p><br /></p><p><strong>主要步骤如下</strong></p><ul list-paddingleft-2"="" style="list-style-type: disc;"><li><p>缓存Lua函数在Lua环境中的引用</p></li><li><p>在C代码的地方用C的方式设置好回调</p></li><li><p>在C代码回调函数执行的时候，调用lua函数</p></li></ul><p><br /></p><p><strong>实现</strong></p><ul list-paddingleft-2"="" style="list-style-type: disc;"><li><p>C代码绑定回调，调用Lua函数</p></li></ul><div><div id="highlighter_673942"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div><div number18="" index17=""  alt1"="">18</div><div number19="" index18=""  alt2"="">19</div><div number20="" index19=""  alt1"="">20</div><div number21="" index20=""  alt2"="">21</div><div number22="" index21=""  alt1"="">22</div><div number23="" index22=""  alt2"="">23</div><div number24="" index23=""  alt1"="">24</div><div number25="" index24=""  alt2"="">25</div><div number26="" index25=""  alt1"="">26</div><div number27="" index26=""  alt2"="">27</div><div number28="" index27=""  alt1"="">28</div><div number29="" index28=""  alt2"="">29</div><div number30="" index29=""  alt1"="">30</div><div number31="" index30=""  alt2"="">31</div><div number32="" index31=""  alt1"="">32</div></td><td><div><div number1="" index0=""  alt2"=""><code keyword=""  bold"="">void</code>&nbsp;<code plain"="">ArmatureNode::registerMovementEventHandler(</code><code color1=""  bold"="">int</code>&nbsp;<code plain"="">handler)</code></div><div number2="" index1=""  alt1"=""><code plain"="">{</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">unregisterMovementEventHandler();&nbsp;&nbsp;</code><code comments"="">//移除之前注册的监听</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">_movementHandler&nbsp;=&nbsp;handler;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//缓存lua函数的引用&nbsp;这个后边说</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">auto&nbsp;dispatcher&nbsp;=&nbsp;getCCEventDispatcher();</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">auto&nbsp;f&nbsp;=&nbsp;[</code><code keyword=""  bold"="">this</code><code plain"="">](cocos2d::EventCustom&nbsp;*event)&nbsp;</code><code comments"="">//注册c代码形式的回调&nbsp;这里用function做</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code></div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">auto&nbsp;eventData&nbsp;=&nbsp;(dragonBones::EventData*)(event-&gt;getUserData());</code></div><div number11="" index10=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">auto&nbsp;type&nbsp;=&nbsp;(</code><code color1=""  bold"="">int</code><code plain"="">)&nbsp;eventData-&gt;getType();</code></div><div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">auto&nbsp;movementId&nbsp;=&nbsp;eventData-&gt;animationState-&gt;name;</code></div><div number13="" index12=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">auto&nbsp;lastState&nbsp;=&nbsp;eventData-&gt;armature-&gt;getAnimation()-&gt;getLastAnimationState();</code></div><div number14="" index13=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number15="" index14=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">auto&nbsp;stack&nbsp;=&nbsp;cocos2d::LuaEngine::getInstance()-&gt;getLuaStack();</code></div><div number16="" index15=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">stack-&gt;pushObject(</code><code keyword=""  bold"="">this</code><code plain"="">,&nbsp;</code><code string"="">"db.ArmatureNode"</code><code plain"="">);</code></div><div number17="" index16=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">stack-&gt;pushInt(type);</code></div><div number18="" index17=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">stack-&gt;pushString(movementId.c_str(),&nbsp;movementId.size());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code></div><div number19="" index18=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//通过LuaStack调用lua里的函数&nbsp;&nbsp;&nbsp;&nbsp;最后一个参数设置参数个数</code></div><div number20="" index19=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">stack-&gt;executeFunctionByHandler(_movementHandler,&nbsp;3);</code></div><div number21="" index20=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">};</code></div><div number22="" index21=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number23="" index22=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">dispatcher-&gt;addCustomEventListener(dragonBones::EventData::COMPLETE,&nbsp;f);</code></div><div number24="" index23=""  alt1"=""><code plain"="">}</code></div><div number25="" index24=""  alt2"=""><code keyword=""  bold"="">void</code>&nbsp;<code plain"="">ArmatureNode::unregisterMovementEventHandler(</code><code keyword=""  bold"="">void</code><code plain"="">)</code></div><div number26="" index25=""  alt1"=""><code plain"="">{</code></div><div number27="" index26=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">if</code>&nbsp;<code plain"="">(0&nbsp;!=&nbsp;_movementHandler)</code></div><div number28="" index27=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code></div><div number29="" index28=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">cocos2d::LuaEngine::getInstance()-&gt;removeScriptHandler(_movementHandler);&nbsp;</code><code comments"="">//移除lua函数的绑定</code></div><div number30="" index29=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">_movementHandler&nbsp;=&nbsp;0;</code></div><div number31="" index30=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">}</code></div><div number32="" index31=""  alt1"=""><code plain"="">}</code></div></div></td></tr></tbody></table></div></div><ul list-paddingleft-2"="" style="list-style-type: disc;"><li><p>提供Lua函数绑定到C的方法 &nbsp;&nbsp;</p></li></ul><p>上边的这个函数直接用cocos里的genbinding.py 是无法正确生成Lua里可调用的接口的，需要手动编写绑定方法.</p><p>说这个得用到Cocos2d-x中提供的一个方法：toluafix_ref_function会把一个Lua栈中的方法转成一个int，以便C++中调用。我会在最后面说这个</p><div><div id="highlighter_948637"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div><div number18="" index17=""  alt1"="">18</div><div number19="" index18=""  alt2"="">19</div><div number20="" index19=""  alt1"="">20</div><div number21="" index20=""  alt2"="">21</div></td><td><div><div number1="" index0=""  alt2"=""><code color1=""  bold"="">int</code>&nbsp;<code plain"="">tolua_db_DBCCArmature_registerMovementEventHandler(lua_State*&nbsp;tolua_S)</code></div><div number2="" index1=""  alt1"=""><code plain"="">{</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">if</code>&nbsp;<code plain"="">(NULL&nbsp;==&nbsp;tolua_S)</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">return</code>&nbsp;<code plain"="">0;</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1=""  bold"="">int</code>&nbsp;<code plain"="">argc&nbsp;=&nbsp;0;</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">dragonBones::ArmatureNode*&nbsp;self&nbsp;=&nbsp;nullptr;</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">self&nbsp;=&nbsp;</code><code keyword=""  bold"="">static_cast</code><code plain"="">&lt;dragonBones::ArmatureNode*&gt;(tolua_tousertype(tolua_S,1,0));&nbsp;</code><code comments"="">//第一个参数&nbsp;就是lua里的self</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">argc&nbsp;=&nbsp;lua_gettop(tolua_S)&nbsp;-&nbsp;1;</code></div><div number11="" index10=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">if</code>&nbsp;<code plain"="">(1&nbsp;==&nbsp;argc)</code></div><div number13="" index12=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code></div><div number14="" index13=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//第二个参数，就是Lua里的function&nbsp;这里要通过toluafix_ref_function这个函数映射成一个Int值</code></div><div number15="" index14=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1=""  bold"="">int</code>&nbsp;<code plain"="">handler&nbsp;=&nbsp;(toluafix_ref_function(tolua_S,2,0));&nbsp;</code></div><div number16="" index15=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">self-&gt;registerMovementEventHandler(handler);</code></div><div number17="" index16=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number18="" index17=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">return</code>&nbsp;<code plain"="">0;</code></div><div number19="" index18=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">}</code></div><div number20="" index19=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">return</code>&nbsp;<code plain"="">0;</code></div><div number21="" index20=""  alt2"=""><code plain"="">}</code></div></div></td></tr></tbody></table></div></div><p>&nbsp;</p><ul list-paddingleft-2"="" style="list-style-type: disc;"><li><p>将绑定方法绑定到Lua环境里</p></li></ul><div><div id="highlighter_443360"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div></td><td><div><div number1="" index0=""  alt2"=""><code color1=""  bold"="">int</code>&nbsp;<code plain"="">extends_ArmatureNode(lua_State*&nbsp;tolua_S)</code></div><div number2="" index1=""  alt1"=""><code plain"="">{</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushstring(tolua_S,&nbsp;</code><code string"="">"db.ArmatureNode"</code><code plain"="">);</code><code comments"="">//之前db.ArmatureNode是通过脚本绑定在lua里。这里只做扩展</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_rawget(tolua_S,&nbsp;LUA_REGISTRYINDEX);</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">if</code>&nbsp;<code plain"="">(lua_istable(tolua_S,-1))</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">{</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushstring(tolua_S,</code><code string"="">"registerMovementEventHandler"</code><code plain"="">);</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushcfunction(tolua_S,tolua_db_DBCCArmature_registerMovementEventHandler);</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_rawset(tolua_S,-3);</code></div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">}</code></div><div number11="" index10=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pop(tolua_S,&nbsp;1);</code></div><div number13="" index12=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">return</code>&nbsp;<code plain"="">0;</code></div><div number14="" index13=""  alt1"=""><code plain"="">}</code></div></div></td></tr></tbody></table></div></div><ul list-paddingleft-2"="" style="list-style-type: disc;"><li><p>Lua里设置回调到C++</p></li></ul><div><div id="highlighter_72249"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div></td><td><div><div number1="" index0=""  alt2"=""><code spaces"="">&nbsp;</code><code plain"="">local&nbsp;arm&nbsp;=&nbsp;db.ArmatureNode:create(</code><code string"="">"Dragon"</code><code plain"="">)</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">local&nbsp;animation&nbsp;=&nbsp;arm:getAnimation()</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">animation:gotoAndPlay(</code><code string"="">"walk"</code><code plain"="">)</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">arm:registerMovementEventHandler(</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">function(...)</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">print(...)&nbsp;</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">end</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">)</code></div></div></td></tr></tbody></table></div></div><p><strong><span style="line-height: 1.8;"><br /></span></strong></p><p><strong><span style="line-height: 1.8;">-测试</span></strong></p><p>打印回调输出，测试通过 userdata 8 walk</p><p><br /></p><p><strong>其他</strong></p><ul list-paddingleft-2"="" style="list-style-type: disc;"><li><p>toluafix_ref_function 以及 toluafix_get_function_by_refid</p></li></ul><p>这 两个方法是相互对应的  toluafix_ref_function这个方法在注册表上将一个lua的function与一个function_id生成映射  toluafix_get_function_by_refid 方法可以通过前一个方法生成的function_id来讲绑定的lua  function放到栈顶</p><div><div id="highlighter_757355"  cpp"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div><div number18="" index17=""  alt1"="">18</div><div number19="" index18=""  alt2"="">19</div><div number20="" index19=""  alt1"="">20</div><div number21="" index20=""  alt2"="">21</div><div number22="" index21=""  alt1"="">22</div><div number23="" index22=""  alt2"="">23</div></td><td><div><div number1="" index0=""  alt2"=""><code comments"="">//</code></div><div number2="" index1=""  alt1"=""><code plain"="">TOLUA_API&nbsp;</code><code color1=""  bold"="">int</code>&nbsp;<code plain"="">toluafix_ref_function(lua_State*&nbsp;L,&nbsp;</code><code color1=""  bold"="">int</code>&nbsp;<code plain"="">lo,&nbsp;</code><code color1=""  bold"="">int</code>&nbsp;<code plain"="">def)</code></div><div number3="" index2=""  alt2"=""><code plain"="">{</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">if</code>&nbsp;<code plain"="">(!lua_isfunction(L,&nbsp;lo))&nbsp;</code><code keyword=""  bold"="">return</code>&nbsp;<code plain"="">0;</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">s_function_ref_id++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//function_id&nbsp;加1</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushstring(L,&nbsp;TOLUA_REFID_FUNCTION_MAPPING);</code><code comments"="">//在注册表上，存放luafunction&nbsp;映射table&nbsp;的key压栈</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_rawget(L,&nbsp;LUA_REGISTRYINDEX);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//获取方法映射表，放在栈顶</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushinteger(L,&nbsp;s_function_ref_id);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//function_id压栈</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushvalue(L,&nbsp;lo);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//lo有效处索引处是lua方法，lua方法拷贝，压栈</code></div><div number10="" index9=""  alt1"="">&nbsp;</div><div number11="" index10=""  alt2"="">&nbsp;</div><div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_rawset(L,&nbsp;-3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//生成映射&nbsp;</code></div><div number13="" index12=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pop(L,&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code></div><div number14="" index13=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword=""  bold"="">return</code>&nbsp;<code plain"="">s_function_ref_id;</code></div><div number15="" index14=""  alt2"=""><code plain"="">}</code></div><div number16="" index15=""  alt1"=""><code plain"="">TOLUA_API&nbsp;</code><code keyword=""  bold"="">void</code>&nbsp;<code plain"="">toluafix_get_function_by_refid(lua_State*&nbsp;L,&nbsp;</code><code color1=""  bold"="">int</code>&nbsp;<code plain"="">refid)</code></div><div number17="" index16=""  alt2"=""><code plain"="">{</code></div><div number18="" index17=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushstring(L,&nbsp;TOLUA_REFID_FUNCTION_MAPPING);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//存放luafunction&nbsp;映射table&nbsp;的key压栈</code></div><div number19="" index18=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_rawget(L,&nbsp;LUA_REGISTRYINDEX);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//获取方法映射表，放在栈顶</code></div><div number20="" index19=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_pushinteger(L,&nbsp;refid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//function_id压栈</code></div><div number21="" index20=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_rawget(L,&nbsp;-2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//获取到的luafunction&nbsp;放到栈顶</code></div><div number22="" index21=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">lua_remove(L,&nbsp;-2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//</code></div><div number23="" index22=""  alt2"=""><code plain"="">}</code></div></div></td></tr></tbody></table></div></div><ul list-paddingleft-2"="" style="list-style-type: disc;"><li><p><span style="line-height: 1.8;">executeFunctionByHandler</span></p></li></ul><p>executeFunctionByHandler 这个方法只是通过toluafix_get_function_by_refid 获取到function然后通过lua_pcall 方法调用，代码就不写了。</p></div><img src ="http://www.cppblog.com/colorful/aggbug/209553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2015-01-17 11:12 <a href="http://www.cppblog.com/colorful/archive/2015/01/17/209553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua意见</title><link>http://www.cppblog.com/colorful/archive/2015/01/13/209495.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 13 Jan 2015 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2015/01/13/209495.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/209495.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2015/01/13/209495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/209495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/209495.html</trackback:ping><description><![CDATA[table for循环的例子，这么一个明显的坑，都没人作一个提醒，这样肯定不利于一门语言的推广与发展<img src ="http://www.cppblog.com/colorful/aggbug/209495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2015-01-13 10:54 <a href="http://www.cppblog.com/colorful/archive/2015/01/13/209495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua的sleep函数</title><link>http://www.cppblog.com/colorful/archive/2015/01/01/209374.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 01 Jan 2015 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2015/01/01/209374.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/209374.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2015/01/01/209374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/209374.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/209374.html</trackback:ping><description><![CDATA[<div><div style="text-align:left">     <p>一个不幸的消息是Lua中没有内置sleep函数，我们需要DIY。有4种方法可以实现sleep函数，如下： </p> <p><strong>方法1</strong></p> <p>--在一个死循环中设置一个跳出条件，但是这样的做法会占用大量CPU资源，强烈不推荐使用哦</p> <p>function sleep(n)<br /></p> <p>&nbsp;&nbsp;    local t0 = os.clock()</p> <p>&nbsp;&nbsp;    while os.clock() - t0 &lt;= n do end</p> <p><strong>方法2</strong></p> <p>--调用系统的sleep函数，不消耗CPU，但是Windows系统中没有内置这个命令（如果你又安装Cygwin神马的也行）。推荐在Linux系统中使用该方法</p> <p>function sleep(n)</p> <p>&nbsp;&nbsp;    os.execute("sleep " .. n)</p> <p><strong>方法3</strong></p> <p>--虽然Windows没有内置sleep命令，但是我们可以稍微利用下ping命令的性质</p> <p>function sleep(n)</p> <p>&nbsp;&nbsp;    if n &gt; 0 then os.execute("ping -n " .. tonumber(n + 1) .. " localhost &gt; NUL") end</p> <p><strong>方法4</strong></p> <p>--使用socket库中select函数，可以传递0.1给n，使得休眠的时间精度达到毫秒级别。</p> <p>&#8205;require("socket")</p> <p>function sleep(n)</p> <p>&nbsp;&nbsp;    socket.select(nil, nil, n)</p>    </div></div><img src ="http://www.cppblog.com/colorful/aggbug/209374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2015-01-01 16:59 <a href="http://www.cppblog.com/colorful/archive/2015/01/01/209374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个很不错的lua教程</title><link>http://www.cppblog.com/colorful/archive/2014/12/19/209257.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Fri, 19 Dec 2014 11:12:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2014/12/19/209257.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/209257.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2014/12/19/209257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/209257.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/209257.html</trackback:ping><description><![CDATA[<div>http://www.cnblogs.com/stephen-liu74/category/360139.html</div><div><h2><a id="cb_post_title_url" href="http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html"><div><h2><a id="cb_post_title_url" href="http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html">Step By Step(Lua调用C函数)</a></h2></div></a></h2></div><div>&nbsp;  Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。对于有些和操作系统相关的功能，或者是对效率要求较高的模块，我们完全可以通过C函数 来实现，之后再通过Lua调用指定的C函数。对于那些可被Lua调用的C函数而言，其接口必须遵循Lua要求的形式，即<span style="color: #0000ff;">typedef int (*lua_CFunction)(lua_State* L)</span>。 简单说明一下，该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数，实现者可以通过该指针进一步获取Lua代码中实际传入的参数。返回值是整 型，表示该C函数将返回给Lua代码的返回值数量，如果没有返回值，则return  0即可。需要说明的是，C函数无法直接将真正的返回值返回给Lua代码，而是通过虚拟栈来传递Lua代码和C函数之间的调用参数和返回值的。这里我们将介 绍两种Lua调用C函数的规则。<br /><span style="color: #800080; font-size: 15px;">&nbsp;&nbsp; &nbsp;1. C函数作为应用程序的一部分。</span> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div> <pre><span style="color: #008080;"> 1</span> #include &lt;stdio.h&gt; <span style="color: #008080;"> 2</span> #include &lt;<span style="color: #0000ff;">string</span>.h&gt; <span style="color: #008080;"> 3</span> #include &lt;lua.hpp&gt; <span style="color: #008080;"> 4</span> #include &lt;lauxlib.h&gt; <span style="color: #008080;"> 5</span> #include &lt;lualib.h&gt; <span style="color: #008080;"> 6</span>  <span style="color: #008080;"> 7</span> <span style="color: #008000;">//</span><span style="color: #008000;">待Lua调用的C注册函数。</span> <span style="color: #008080;"> 8</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> add2(lua_State*<span style="color: #000000;"> L) </span><span style="color: #008080;"> 9</span> <span style="color: #000000;">{ </span><span style="color: #008080;">10</span>     <span style="color: #008000;">//</span><span style="color: #008000;">检查栈中的参数是否合法，1表示Lua调用时的第一个参数(从左到右)，依此类推。 </span><span style="color: #008080;">11</span>     <span style="color: #008000;">//</span><span style="color: #008000;">如果Lua代码在调用时传递的参数不为number，该函数将报错并终止程序的执行。</span> <span style="color: #008080;">12</span>     <span style="color: #0000ff;">double</span> op1 = luaL_checknumber(L,<span style="color: #800080;">1</span><span style="color: #000000;">); </span><span style="color: #008080;">13</span>     <span style="color: #0000ff;">double</span> op2 = luaL_checknumber(L,<span style="color: #800080;">2</span><span style="color: #000000;">); </span><span style="color: #008080;">14</span>     <span style="color: #008000;">//</span><span style="color: #008000;">将函数的结果压入栈中。如果有多个返回值，可以在这里多次压入栈中。</span> <span style="color: #008080;">15</span>     lua_pushnumber(L,op1 +<span style="color: #000000;"> op2); </span><span style="color: #008080;">16</span>     <span style="color: #008000;">//</span><span style="color: #008000;">返回值用于提示该C函数的返回值数量，即压入栈中的返回值数量。</span> <span style="color: #008080;">17</span>     <span style="color: #0000ff;">return</span> <span style="color: #800080;">1</span><span style="color: #000000;">; </span><span style="color: #008080;">18</span> <span style="color: #000000;">} </span><span style="color: #008080;">19</span>  <span style="color: #008080;">20</span> <span style="color: #008000;">//</span><span style="color: #008000;">另一个待Lua调用的C注册函数。</span> <span style="color: #008080;">21</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> sub2(lua_State*<span style="color: #000000;"> L) </span><span style="color: #008080;">22</span> <span style="color: #000000;">{ </span><span style="color: #008080;">23</span>     <span style="color: #0000ff;">double</span> op1 = luaL_checknumber(L,<span style="color: #800080;">1</span><span style="color: #000000;">); </span><span style="color: #008080;">24</span>     <span style="color: #0000ff;">double</span> op2 = luaL_checknumber(L,<span style="color: #800080;">2</span><span style="color: #000000;">); </span><span style="color: #008080;">25</span>     lua_pushnumber(L,op1 -<span style="color: #000000;"> op2); </span><span style="color: #008080;">26</span>     <span style="color: #0000ff;">return</span> <span style="color: #800080;">1</span><span style="color: #000000;">; </span><span style="color: #008080;">27</span> <span style="color: #000000;">} </span><span style="color: #008080;">28</span>  <span style="color: #008080;">29</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span>* testfunc = <span style="color: #800000;">"</span><span style="color: #800000;">print(add2(1.0,2.0)) print(sub2(20.1,19))</span><span style="color: #800000;">"</span><span style="color: #000000;">; </span><span style="color: #008080;">30</span>  <span style="color: #008080;">31</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> main() </span><span style="color: #008080;">32</span> <span style="color: #000000;">{ </span><span style="color: #008080;">33</span>     lua_State* L =<span style="color: #000000;"> luaL_newstate(); </span><span style="color: #008080;">34</span> <span style="color: #000000;">    luaL_openlibs(L); </span><span style="color: #008080;">35</span>     <span style="color: #008000;">//</span><span style="color: #008000;">将指定的函数注册为Lua的全局函数变量，其中第一个字符串参数为Lua代码 </span><span style="color: #008080;">36</span>     <span style="color: #008000;">//</span><span style="color: #008000;">在调用C函数时使用的全局函数名，第二个参数为实际C函数的指针。</span> <span style="color: #008080;">37</span>     lua_register(L, <span style="color: #800000;">"</span><span style="color: #800000;">add2</span><span style="color: #800000;">"</span><span style="color: #000000;">, add2); </span><span style="color: #008080;">38</span>     lua_register(L, <span style="color: #800000;">"</span><span style="color: #800000;">sub2</span><span style="color: #800000;">"</span><span style="color: #000000;">, sub2); </span><span style="color: #008080;">39</span>     <span style="color: #008000;">//</span><span style="color: #008000;">在注册完所有的C函数之后，即可在Lua的代码块中使用这些已经注册的C函数了。</span> <span style="color: #008080;">40</span>     <span style="color: #0000ff;">if</span><span style="color: #000000;"> (luaL_dostring(L,testfunc)) </span><span style="color: #008080;">41</span>         printf(<span style="color: #800000;">"</span><span style="color: #800000;">Failed to invoke.\n</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #008080;">42</span> <span style="color: #000000;">    lua_close(L); </span><span style="color: #008080;">43</span>     <span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">; </span><span style="color: #008080;">44</span> }</pre> <div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>&nbsp;&nbsp;&nbsp; <span style="font-size: 15px; color: #800080;">2. C函数库成为Lua的模块。</span><br />&nbsp;&nbsp;   &nbsp;将包含C函数的代码生成库文件，如Linux的so，或Windows的DLL，同时拷贝到Lua代码所在的当前目录，或者是LUA_CPATH环境变 量所指向的目录，以便于Lua解析器可以正确定位到他们。在我当前的Windows系统中，我将其copy到"C:\Program  Files\Lua\5.1\clibs\"，这里包含了所有Lua可调用的C库。见如下C语言代码和关键性注释：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div> <pre><span style="color: #008080;"> 1</span> #include &lt;stdio.h&gt; <span style="color: #008080;"> 2</span> #include &lt;<span style="color: #0000ff;">string</span>.h&gt; <span style="color: #008080;"> 3</span> #include &lt;lua.hpp&gt; <span style="color: #008080;"> 4</span> #include &lt;lauxlib.h&gt; <span style="color: #008080;"> 5</span> #include &lt;lualib.h&gt; <span style="color: #008080;"> 6</span>  <span style="color: #008080;"> 7</span> <span style="color: #008000;">//</span><span style="color: #008000;">待注册的C函数，该函数的声明形式在上面的例子中已经给出。 </span><span style="color: #008080;"> 8</span> <span style="color: #008000;">//</span><span style="color: #008000;">需要说明的是，该函数必须以C的形式被导出，因此extern "C"是必须的。 </span><span style="color: #008080;"> 9</span> <span style="color: #008000;">//</span><span style="color: #008000;">函数代码和上例相同，这里不再赘述。</span> <span style="color: #008080;">10</span> <span style="color: #0000ff;">extern</span> <span style="color: #800000;">"</span><span style="color: #800000;">C</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">int</span> add(lua_State*<span style="color: #000000;"> L)  </span><span style="color: #008080;">11</span> <span style="color: #000000;">{ </span><span style="color: #008080;">12</span>     <span style="color: #0000ff;">double</span> op1 = luaL_checknumber(L,<span style="color: #800080;">1</span><span style="color: #000000;">); </span><span style="color: #008080;">13</span>     <span style="color: #0000ff;">double</span> op2 = luaL_checknumber(L,<span style="color: #800080;">2</span><span style="color: #000000;">); </span><span style="color: #008080;">14</span>     lua_pushnumber(L,op1 +<span style="color: #000000;"> op2); </span><span style="color: #008080;">15</span>     <span style="color: #0000ff;">return</span> <span style="color: #800080;">1</span><span style="color: #000000;">; </span><span style="color: #008080;">16</span> <span style="color: #000000;">} </span><span style="color: #008080;">17</span>  <span style="color: #008080;">18</span> <span style="color: #0000ff;">extern</span> <span style="color: #800000;">"</span><span style="color: #800000;">C</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">int</span> sub(lua_State*<span style="color: #000000;"> L) </span><span style="color: #008080;">19</span> <span style="color: #000000;">{ </span><span style="color: #008080;">20</span>     <span style="color: #0000ff;">double</span> op1 = luaL_checknumber(L,<span style="color: #800080;">1</span><span style="color: #000000;">); </span><span style="color: #008080;">21</span>     <span style="color: #0000ff;">double</span> op2 = luaL_checknumber(L,<span style="color: #800080;">2</span><span style="color: #000000;">); </span><span style="color: #008080;">22</span>     lua_pushnumber(L,op1 -<span style="color: #000000;"> op2); </span><span style="color: #008080;">23</span>     <span style="color: #0000ff;">return</span> <span style="color: #800080;">1</span><span style="color: #000000;">; </span><span style="color: #008080;">24</span> <span style="color: #000000;">} </span><span style="color: #008080;">25</span>  <span style="color: #008080;">26</span> <span style="color: #008000;">//</span><span style="color: #008000;">luaL_Reg结构体的第一个字段为字符串，在注册时用于通知Lua该函数的名字。 </span><span style="color: #008080;">27</span> <span style="color: #008000;">//</span><span style="color: #008000;">第一个字段为C函数指针。 </span><span style="color: #008080;">28</span> <span style="color: #008000;">//</span><span style="color: #008000;">结构体数组中的最后一个元素的两个字段均为NULL，用于提示Lua注册函数已经到达数组的末尾。</span> <span style="color: #008080;">29</span> <span style="color: #0000ff;">static</span> luaL_Reg mylibs[] =<span style="color: #000000;"> {  </span><span style="color: #008080;">30</span>     {<span style="color: #800000;">"</span><span style="color: #800000;">add</span><span style="color: #800000;">"</span><span style="color: #000000;">, add}, </span><span style="color: #008080;">31</span>     {<span style="color: #800000;">"</span><span style="color: #800000;">sub</span><span style="color: #800000;">"</span><span style="color: #000000;">, sub}, </span><span style="color: #008080;">32</span> <span style="color: #000000;">    {NULL, NULL}  </span><span style="color: #008080;">33</span> <span style="color: #000000;">};  </span><span style="color: #008080;">34</span>  <span style="color: #008080;">35</span> <span style="color: #008000;">//</span><span style="color: #008000;">该C库的唯一入口函数。其函数签名等同于上面的注册函数。见如下几点说明： </span><span style="color: #008080;">36</span> <span style="color: #008000;">//</span><span style="color: #008000;">1. 我们可以将该函数简单的理解为模块的工厂函数。 </span><span style="color: #008080;">37</span> <span style="color: #008000;">//</span><span style="color: #008000;">2. 其函数名必须为luaopen_xxx，其中xxx表示library名称。Lua代码require "xxx"需要与之对应。 </span><span style="color: #008080;">38</span> <span style="color: #008000;">//</span><span style="color: #008000;">3. 在luaL_register的调用中，其第一个字符串参数为模块名"xxx"，第二个参数为待注册函数的数组。 </span><span style="color: #008080;">39</span> <span style="color: #008000;">//</span><span style="color: #008000;">4. 需要强调的是，所有需要用到"xxx"的代码，不论C还是Lua，都必须保持一致，这是Lua的约定， </span><span style="color: #008080;">40</span> <span style="color: #008000;">//</span><span style="color: #008000;">   否则将无法调用。</span> <span style="color: #008080;">41</span> <span style="color: #0000ff;">extern</span> <span style="color: #800000;">"</span><span style="color: #800000;">C</span><span style="color: #800000;">"</span><span style="color: #000000;"> __declspec(dllexport) </span><span style="color: #008080;">42</span> <span style="color: #0000ff;">int</span> luaopen_mytestlib(lua_State*<span style="color: #000000;"> L)  </span><span style="color: #008080;">43</span> <span style="color: #000000;">{ </span><span style="color: #008080;">44</span>     <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span>* libName = <span style="color: #800000;">"</span><span style="color: #800000;">mytestlib</span><span style="color: #800000;">"</span><span style="color: #000000;">; </span><span style="color: #008080;">45</span> <span style="color: #000000;">    luaL_register(L,libName,mylibs); </span><span style="color: #008080;">46</span>     <span style="color: #0000ff;">return</span> <span style="color: #800080;">1</span><span style="color: #000000;">; </span><span style="color: #008080;">47</span> }</pre> <div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>&nbsp;&nbsp;&nbsp; 见如下Lua代码：</p> <div> <pre><span style="color: #008080;">1</span> <span style="color: #ff00ff;">require</span> <span style="color: #800000;">"</span><span style="color: #800000;">mytestlib</span><span style="color: #800000;">"</span>  <span style="color: #008000;">--</span><span style="color: #008000;">指定包名称</span> <span style="color: #008080;">2</span>  <span style="color: #008080;">3</span> <span style="color: #008000;">--</span><span style="color: #008000;">在调用时，必须是package.function</span> <span style="color: #008080;">4</span> <span style="color: #ff00ff;">print</span>(mytestlib.add(<span style="color: #800080;">1.0</span>,<span style="color: #800080;">2.0</span><span style="color: #000000;">)) </span><span style="color: #008080;">5</span> <span style="color: #ff00ff;">print</span>(mytestlib.sub(<span style="color: #800080;">20.1</span>,<span style="color: #800080;">19</span>))</pre> </div></div><img src ="http://www.cppblog.com/colorful/aggbug/209257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2014-12-19 19:12 <a href="http://www.cppblog.com/colorful/archive/2014/12/19/209257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VS2010编译luabind</title><link>http://www.cppblog.com/colorful/archive/2014/09/02/208207.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 02 Sep 2014 09:56:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2014/09/02/208207.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/208207.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2014/09/02/208207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/208207.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/208207.html</trackback:ping><description><![CDATA[<div>http://www.cppblog.com/eros/archive/2009/04/29/81508.aspx</div><div><div> 		<p>&nbsp;&nbsp;&nbsp;&nbsp; 学了一段时间Lua，显然直接在项目中使用是很不方便，google了一下，似乎大家都对luabind这个lua包装类青睐有加，于是我也随大势想用用看。<br />&nbsp;&nbsp;&nbsp;&nbsp; 先做好准备工作，下载了luabin 0.8.1源码，Boost 1.3.8源码和lua 5.1.4源码，编译环境是VS2008 SP1。之前在网上看到一些文章说这些开源软件之间的版本依赖比较敏感，可能会有这样那样的问题，动手之前有些惶恐。<br />&nbsp;&nbsp;&nbsp;&nbsp; 幸运的是，编译过程很顺利，如下：<br />&nbsp;&nbsp;&nbsp;&nbsp; 1.编译lua 5.1.4<br />&nbsp;&nbsp;&nbsp;&nbsp; 进入VS2008的命令行工具，定位到lua的源码目录下，执行命令etc\luavs.bat，没什么问题的话很快就可以编译好lua，得到lua51.lib和lua51.dll。<br />&nbsp;&nbsp;&nbsp;&nbsp; 2.编译luabind<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解压下载回来的luabind压缩包，假设解压到d:\luabind-0.8.1\，Boost解压到d:\boost 1_38_0\，lua解压到d:\lua&nbsp;5.1.4\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在 VS中新建一个静态库项目，将d:\luabind-0.8.1\src下的源码全部添加到项目中，然后在项目中新建luabind和luabind \detail\两个虚拟文件夹，对应的将d:\luabind-0.8.1\luabind和d:\luabind-0.8.1\luabind \detail下的文件添加到文件夹中。<br />&nbsp;&nbsp;&nbsp;&nbsp;  然后为项目添加附加包含目录，右键点击项目节点-&gt;属性-&gt;配置属性-&gt;C\C++标签下，在附加包含目录中填入d: \luabind-0.8.1\；d:\boost 1_38_0\k；d:\lua&nbsp;5.1.4\src\。然后修改项目字符集为多字节字符集。<br />&nbsp;&nbsp;&nbsp;&nbsp; 准备就绪，生成项目。在我的环境中编译很顺利，没有出现任何问题，成功后会得到luabind.lib。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 接下来就按照惯例来写一个hello world程序作为使用luabind的第一步。<br />&nbsp;&nbsp;&nbsp;&nbsp; 在VS中新建一个控制台项目，类型为DLL，命名项目为Hello World，然后键入以下代码：<br /></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdafx.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">luabind</span><span style="color: #000000">/</span><span style="color: #000000">luabind.hpp</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;greet()<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_85_120_Open_Image" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /></span><span id="Codehighlighter1_85_120_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span>&nbsp;<span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;world!\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">extern</span>&nbsp;<span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span>&nbsp;<span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;__declspec(dllexport)&nbsp;init(lua_State</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;L)<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_179_272_Open_Image" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /></span><span id="Codehighlighter1_179_272_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span>&nbsp;<span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;luabind;<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /></span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;open(L);<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;module(L)<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;[<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def(</span><span style="color: #000000">"</span><span style="color: #000000">greet</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">greet)<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;];<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span>&nbsp;<span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div> <p><br />&nbsp;&nbsp;&nbsp;注意，在Windows环境下init函数之前是要加 __declspec(dllexport)才能将函数导出的，而luabind的文档中的环境是linux，默认不用加 __declspec(dllexport)也可以导出(就因为这个折腾了我半天才把hello word成功运行)。<br />&nbsp;&nbsp;&nbsp;编译项目，(<span style="font-family: '#ce_temp_font#'; color: #ff0000; font-size: 10.5pt;'yes'">记得将luabind.lib和lua51.lib添加到链接选项中：项目属性-&gt;连接器-&gt;输入-&gt;附加依赖文件，加入luabind.lib和lua51.lib</span>)。<br />&nbsp;&nbsp; 将hello world.dll放到lua51.dll和lua.exe所在的目录下。<br />&nbsp;&nbsp;&nbsp;打开lua命令行，键入:<br />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.cppblog.com/images/cppblog_com/eros/10412/r_Hello%20World.bmp" border="0" height="104" width="413" /><br />&nbsp;&nbsp; 测试成功，enjoy。</p>  	</div></div><img src ="http://www.cppblog.com/colorful/aggbug/208207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2014-09-02 17:56 <a href="http://www.cppblog.com/colorful/archive/2014/09/02/208207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 浅析Lua中table的遍历 </title><link>http://www.cppblog.com/colorful/archive/2014/08/25/208122.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 25 Aug 2014 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2014/08/25/208122.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/208122.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2014/08/25/208122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/208122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/208122.html</trackback:ping><description><![CDATA[<div>http://rangercyh.blog.51cto.com/1444712/1032925</div><div><p>当我在工作中使用lua进行开发时，发现在lua中有4种方式遍历一个table，当然，从本质上来说其实都一样，只是形式不同，这四种方式分别是：</p> <pre><ol><li><span>for&nbsp;key,&nbsp;value&nbsp;in&nbsp;pairs(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>    XXX&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li><li>&nbsp;</li><li><span>for&nbsp;key,&nbsp;value&nbsp;in&nbsp;ipairs(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>    XXX&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li><li>&nbsp;</li><li><span>for&nbsp;i=1,&nbsp;#(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;XXX&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li><li>&nbsp;</li><li><span>for&nbsp;i=1,&nbsp;table.maxn(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;XXX&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>前两种是泛型遍历，后两种是数值型遍历。当然你还会说lua的table遍历还有很多种方法啊，没错，不过最常见的这些遍历确实有必要弄清楚。</p> <p>这四种方式各有特点，由于在工作中我几乎每天都会使用遍历table的方法，一开始也非常困惑这些方式的不同，一段时间后才渐渐明白，这里我也是把 自己的一点经验告诉大家，对跟我一样的lua初学者也许有些帮助（至少当初我在写的时候在网上就找了很久，不知道是因为大牛们都认为这些很简单，不需要 说，还是因为我笨，连这都要问）。</p> <p>首先要明确一点，就是lua中table并非像是C/C++中的数组一样是顺序存储的，准确来说lua中的table更加像是C++中的map，通 过Key对应存储Value，但是并非顺序来保存key-value对，而是使用了hash的方式，这样能够更加快速的访问key对应的value，我们 也知道hash表的遍历需要使用所谓的迭代器来进行，同样，lua也有自己的迭代器，就是上面4种遍历方式中的pairs和ipairs遍历。但是lua 同时提供了按照key来遍历的方式（另外两种，实质上是一种），正式因为它提供了这种按key的遍历，才造成了我一开始的困惑，我一度认为lua中关于 table的遍历是按照我table定义key的顺序来的。</p> <p>下面依次来讲讲四种遍历方式，首先来看for k,v in pairs(tbtest) do这种方式：</p> <p>先看效果：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[4]&nbsp;=&nbsp;4,&nbsp;&nbsp;</li><li>}&nbsp;</li><li>&nbsp;</li><li><span>for&nbsp;key,&nbsp;value&nbsp;in&nbsp;pairs(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;print(value)&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>我认为输出应该是1，2，3，4，实际上的输出是1，2，4，3。我因为这个造成了一个bug，这是后话。</p> <p>也就是说for k,v in pairs(tbtest) do 这样的遍历顺序并非是tbtest中table的排列顺序，而是根据tbtest中key的hash值排列的顺序来遍历的。</p> <p>&nbsp;</p> <p>当然，同时lua也提供了按照key的大小顺序来遍历的，注意，是大小顺序，仍然不是key定义的顺序，这种遍历方式就是for k,v in ipairs(tbtest) do。</p> <p>for k,v in ipairs(tbtest) do 这样的循环必须要求tbtest中的key为顺序的，而且必须是从1开始，ipairs只会从1开始按连续的key顺序遍历到key不连续为止。</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>    [5]&nbsp;=&nbsp;5,&nbsp;&nbsp;</li><li>}&nbsp;</li><li>&nbsp;</li><li><span>for&nbsp;k,v&nbsp;in&nbsp;ipairs(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>    print(v)&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>只会打印1，2，3。而5则不会显示。</p> <pre><ol><li><span>local&nbsp;tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>    [5]&nbsp;=&nbsp;5,&nbsp;&nbsp;</li><li>}&nbsp;</li><li>&nbsp;</li><li><span>for&nbsp;k,v&nbsp;in&nbsp;ipairs(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>    print(v)&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>这样就一个都不会打印。</p> <p>&nbsp;</p> <p>第三种遍历方式有一种神奇的符号'#'，这个符号的作用是是获取table的长度，比如：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li>print(#(tbtest))&nbsp;</li></ol></pre> <p>打印的就是3</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [6]&nbsp;=&nbsp;6,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li>print(#(tbtest))&nbsp;</li></ol></pre> <p>这样打印的就是2，而且和table内的定义顺序没有关系，无论你是否先定义的key为6的值，&#8216;#&#8217;都会查找key为1的值开始。</p> <p>如果table的定义是这样的：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [<span>"a"]&nbsp;=&nbsp;1,&nbsp;&nbsp;</span></li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>}&nbsp;</li><li>&nbsp;</li><li>print(#(tbtest))&nbsp;</li></ol></pre> <p>那么打印的就是0了。因为&#8216;#&#8217;没有找到key为1的值。同样：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [&#8220;a&#8221;]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [&#8220;b&#8221;]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [&#8220;c&#8221;]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li>print(#(tbtest))&nbsp;</li></ol></pre> <p>打印的也是0</p> <p>所以，for i=1, #(tbtest) do这种遍历，只能遍历当tbtest中存在key为1的value时才会出现结果，而且是按照key从1开始依次递增1的顺序来遍历，找到一个递增不是1的时候就结束不再遍历，无论后面是否仍然是顺序的key，比如：</p> <p>&nbsp;</p> <p>table.maxn获取的只针对整数的key，字符串的key是没办法获取到的，比如：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li>print(<span>table.maxn(tbtest))&nbsp;</span></li><li>&nbsp;</li><li>&nbsp;</li><li>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</li><li>    [6]&nbsp;=&nbsp;6,&nbsp;&nbsp;</li><li>    [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li>print(<span>table.maxn(tbtest))&nbsp;</span></li></ol></pre> <p>这样打印的就是3和6，而且和table内的定义顺序没有关系，无论你是否先定义的key为6的值，table.maxn都会获取整数型key中的最大值。</p> <p>如果table的定义是这样的：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [<span>"a"]&nbsp;=&nbsp;1,&nbsp;&nbsp;</span></li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li>print(<span>table.maxn(tbtest))&nbsp;</span></li></ol></pre> <p>那么打印的就是3了。如果table是：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [&#8220;a&#8221;]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [&#8220;b&#8221;]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [&#8220;c&#8221;]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li>print(<span>table.maxn(tbtest))&nbsp;&nbsp;</span></li><li>print(#(tbtest))&nbsp;</li></ol></pre> <p>那么打印的就全部是0了。</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>换句话说，事实上因为lua中table的构造表达式非常灵活，在同一个table中，你可以随意定义各种你想要的内容，比如：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>    [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>    [<span>"a"]&nbsp;=&nbsp;4,&nbsp;&nbsp;</span></li><li>    [<span>"b"]&nbsp;=&nbsp;5,&nbsp;&nbsp;</span></li><li>}&nbsp;</li></ol></pre> <p>同时由于这个灵活性，你也没有办法获取整个table的长度，其实在coding的过程中，你会发现，你真正想要获取整个table长度的地方几乎没有，你总能采取一种非常巧妙的定义方式，把这种需要获取整个table长度的操作避免掉，比如：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    tbaaa&nbsp;=&nbsp;{&nbsp;&nbsp;</li><li>        [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>        [2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>        [3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>    },&nbsp;&nbsp;</li><li>    [<span>"a"]&nbsp;=&nbsp;4,&nbsp;&nbsp;</span></li><li>    [<span>"b"]&nbsp;=&nbsp;5,&nbsp;&nbsp;</span></li><li>}&nbsp;</li></ol></pre> <p>你可能会惊讶，上面这种table该如何遍历呢？</p> <pre><ol><li><span>for&nbsp;k,&nbsp;v&nbsp;in&nbsp;pairs(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>    print(k,&nbsp;v)&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>输出是：a 4 b 5 tbaaa table:XXXXX。</p> <p>由此你可以看到，其实在table中定义一个table，这个table的名字就是key，对应的内容其实是table的地址。</p> <p>当然，如果你用</p> <pre><ol><li><span>for&nbsp;k,&nbsp;v&nbsp;in&nbsp;ipairs(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>    print(k,v)&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>来遍历的话，就什么都不会打印，因为没有key为1的值。但当你增加一个key为1的值时，ipairs只会打印那一个值，现在你明白ipairs是如何工作的吧。</p> <p>既然这里谈到了遍历，就说一下目前看到的几种针对table的遍历方式：</p> <p>for i=1, #tbtest do --这种方式无法遍历所有的元素，因为'#'只会获取tbtest中从key为1开始的key连续的那几个元素，如果没有key为1，那么这个循环将无法进入</p> <p>for i=1, table.maxn(tbtest) do  --这种方式同样无法遍历所有的元素，因为table.maxn只会获取key为整数中最大的那个数，遍历的元素其实是查找 tbtest[1]~tbtest[整数key中最大值]，所以，对于string做key的元素不会去查找，而且这么查找的效率低下，因为如果你整数 key中定义的最大的key是10000，然而10000以下的key没有几个，那么这么遍历会浪费很多时间，因为会从1开始直到10000每一个元素都 会查找一遍，实际上大多数元素都是不存在的，比如：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [10000]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li><li><span>local&nbsp;count&nbsp;=&nbsp;0&nbsp;&nbsp;</span></li><li><span>for&nbsp;i=1,&nbsp;table.maxn(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li><span>    count&nbsp;=&nbsp;count&nbsp;+&nbsp;1&nbsp;&nbsp;</span></li><li>    print(tbtest[i])&nbsp;&nbsp;</li><li><span>end&nbsp;&nbsp;</span></li><li>print(<span>count)&nbsp;</span></li></ol></pre> <p>你会看到打印结果是多么的坑爹，只有1和10000是有意义的，其他的全是nil，而且count是10000。耗时非常久。一般我不这么遍历。但是有一种情况下又必须这么遍历，这个在我的工作中还真的遇到了，这是后话，等讲完了再谈。</p> <pre><ol><li><span>for&nbsp;k,&nbsp;v&nbsp;in&nbsp;pairs(tbtest)&nbsp;do&nbsp;</span></li></ol></pre> <p>这个是唯一一种可以保证遍历tbtest中每一个元素的方式，别高兴的太早，这种遍历也有它自身的缺点，就是遍历的顺序不是按照tbtest定义的顺序来遍历的，这个前面讲到过，当然，对于不需要顺序遍历的用法，这个是唯一可靠的遍历方式。</p> <pre><ol><li><span>for&nbsp;k,&nbsp;v&nbsp;in&nbsp;ipairs(tbtest)&nbsp;do&nbsp;</span></li></ol></pre> <p>这个只会遍历tbtest中key为整数，而且必须从1开始的那些连续元素，如果没有1开始的key，那么这个遍历是无效的，我个人认为这种遍历方 式完全可以被改造table和for i=1, #(tbtest)  do的方式来代替，因为ipairs的效果和'#'的效果，在遍历的时候是类似的，都是按照key的递增1顺序来遍历。</p> <p>好，再来谈谈为什么我需要使用table.maxn这种非常浪费的方式来遍历，在工作中，  我遇到一个问题，就是需要把当前的周序，转换成对应的奖励，简单来说，就是从一个活动开始算起，每周的奖励都不是固定的，比如1~4周给一种奖励，5~8 周给另一种奖励，或者是一种排名奖励，1~8名给一种奖励，9~16名给另一种奖励，这种情况下，我根据长久的C语言的习惯，会把table定义成这个样 子：</p> <pre><ol><li><span>tbtestAward&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>    [8]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>    [16]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>}&nbsp;</li></ol></pre> <p>这个代表，1~8给奖励1，9~16给奖励3。这样定义的好处是奖励我只需要写一次（这里的奖励用数字做了简化，实际上奖励也是一个大的 table，里面还有非常复杂的结构）。然后我就遇到一个问题，即我需要根据周序数，或者是排名序数来确定给哪一种奖励，比如当前周序数是5，那么我应该 给我定义好的key为8的那一档奖励，或者当前周序数是15，那么我应该给奖励3。由此读者看出，其实我定义的key是一个分界，小于这个key而大于上 一个key，那么就给这个key的奖励，这就是我判断的条件。逻辑上没有问题，但是lua的遍历方式却把我狠狠地坑了一把。读者可以自己想一想我上面介绍 的4种遍历方式，该用哪一种来实现我的这种需求呢？这个函数的大致框架如下：</p> <pre><ol><li><span>function&nbsp;GetAward(nSeq)&nbsp;&nbsp;</span></li><li><span>    for&nbsp;遍历整个奖励表&nbsp;do&nbsp;&nbsp;</span></li><li>        if&nbsp;满足<span>key的条件&nbsp;then&nbsp;&nbsp;</span></li><li><span>            return&nbsp;返回对应奖励的key&nbsp;&nbsp;</span></li><li><span>        end&nbsp;&nbsp;</span></li><li><span>    end&nbsp;&nbsp;</span></li><li><span>    return&nbsp;nil&nbsp;&nbsp;</span></li><li><span>end&nbsp;</span></li></ol></pre> <p>我也不卖关子了，分别来说一说吧，首先因为我的key不是连续的，而且没有key为1的值，所以ipairs和'#'遍历是没用的。这种情况下理想 的遍历貌似是pairs，因为它会遍历我的每一个元素，但是读者不要忘记了，pairs遍历并非是按照我定义的顺序来遍历，如果我真的使用的条件是：序数 nSeq小于这个key而大于上一个key，那么就返回这个key。那么我无法保证程序执行的正确性，因为key的顺序有可能是乱的，也就是有可能先遍历 到的是key为16的值，然后才是key为8的值。</p> <p>这么看来我只剩下table.maxn这么一种方式了，于是我写下了这种代码：</p> <pre><ol><li><span>for&nbsp;i=1,&nbsp;table.maxn(tbtestAward)&nbsp;do&nbsp;&nbsp;</span></li><li>    if&nbsp;tbtestAward[i]&nbsp;~=&nbsp;nil&nbsp;<span>then&nbsp;&nbsp;</span></li><li>        if&nbsp;nSeq&nbsp;&lt;=&nbsp;i&nbsp;<span>then&nbsp;&nbsp;</span></li><li><span>            return&nbsp;i&nbsp;&nbsp;</span></li><li><span>        end&nbsp;&nbsp;</span></li><li><span>    end&nbsp;&nbsp;</span></li><li><span>end&nbsp;&nbsp;</span></li></ol></pre> <p>这么写效率确实低下，因为实际上还是遍历了从key为1开始直到key为table.maxn中间的每一个值，不过能够满足我上面的要求。当时我是 这么实现的，因为这个奖励表会不断的发生变化，这样我每次修改只需要修改这个奖励表就能够满足要求了，后来我想了想，觉得其实我如果自己再定义一个序数转 换成对应的奖励数种类的表就可以避免这种坑爹的操作了，不过如果奖励发生修改，我需要统一排查的地方就不止这个奖励表了，权衡再三，我还是没有改，就这么 写了。没办法，不断变化的需求已经把我磨练的忘记了程序的最高理想。我甚至愿意牺牲算法的效率而去追求改动的稳定性。在此哀悼程序员的无奈。我这种时间换 空间的做法确实不知道好不好。</p> <p>后来我在《Programming In  Lua》中看到了一个神奇的迭代器，使用它就可以达到我想要的这种遍历方式，而且不需要去遍历那些不存在的key。它的方法是把你所需要遍历的table 里的key按照遍历顺序放到另一个临时的table中去，这样只需要遍历这个临时的table按顺序取出原table中的key就可以了。如下：</p> <p>首先定义一个迭代器：</p> <pre><ol><li><span>function&nbsp;pairsByKeys(t)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>local&nbsp;a&nbsp;=&nbsp;{}&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>for&nbsp;n&nbsp;in&nbsp;pairs(t)&nbsp;do&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[#a+1]&nbsp;=&nbsp;n&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>end&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>table.sort(a)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>local&nbsp;i&nbsp;=&nbsp;0&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;function()&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;i&nbsp;+&nbsp;1&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;a[i],&nbsp;t[a[i]]&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>end&nbsp;&nbsp;</span></li><li><span>end&nbsp;</span></li></ol></pre> <p>然后在遍历的时候使用这个迭代器就可以了，table同上，遍历如下：</p> <pre><ol><li><span>for&nbsp;key,&nbsp;value&nbsp;in&nbsp;pairsByKeys(tbtestAward)&nbsp;do&nbsp;&nbsp;</span></li><li>&nbsp;if&nbsp;nSeq&nbsp;&lt;=&nbsp;<span>key&nbsp;then&nbsp;&nbsp;</span></li><li><span>        return&nbsp;key&nbsp;&nbsp;</span></li><li><span>    end&nbsp;&nbsp;</span></li><li><span>end&nbsp;</span></li></ol></pre> <p>并且后来我发现有了这个迭代器，我根本不需要先做一步获取是哪一档次的奖励的操作，直接使用这个迭代器进行发奖就可以了。大师就是大师，我怎么就没想到呢！</p> <p>还有些话我还没有说，比如上面数值型遍历也并非是像看起来那样进行遍历的，比如下面的遍历：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[3]&nbsp;=&nbsp;3,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[5]&nbsp;=&nbsp;5,&nbsp;&nbsp;</li><li>}&nbsp;</li><li>&nbsp;</li><li><span>for&nbsp;i=1,&nbsp;#(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;print(tbtest[i])&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>打印的顺序是：1，2，3。不会打印5，因为5已经不在table的数组数据块中了，我估计是被放到了hash数据块中，但是当我修改其中的一些key时，比如：</p> <pre><ol><li><span>tbtest&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&nbsp;1,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&nbsp;2,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[4]&nbsp;=&nbsp;4,&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;[5]&nbsp;=&nbsp;5,&nbsp;&nbsp;</li><li>}&nbsp;</li><li>&nbsp;</li><li><span>for&nbsp;i=1,&nbsp;#(tbtest)&nbsp;do&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;print(tbtest[i])&nbsp;&nbsp;</li><li><span>end&nbsp;</span></li></ol></pre> <p>打印的内容却是：1，2，nil，4，5。这个地方又遍历到了中间没有的key值，并且还能继续遍历下去。我最近正在看lua源码中table的实 现部分，已经明白了是怎么回事，不过我想等我能够更加清晰的阐述lua中table的实现过程了再向大家介绍。用我师傅的话说就是不要使用一些未定义的行 为方法，避免在工作中出错，不过工作外，我还是希望能明白未定义的行为中那些必然性，o(︶︿︶)o  唉！因果论的孩子伤不起。等我下一篇博文分析lua源码中table的实现就能够更加清晰的说明这些了。</p></div><img src ="http://www.cppblog.com/colorful/aggbug/208122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2014-08-25 14:29 <a href="http://www.cppblog.com/colorful/archive/2014/08/25/208122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua require dofile loadfile区别 </title><link>http://www.cppblog.com/colorful/archive/2014/08/22/208088.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Fri, 22 Aug 2014 01:24:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2014/08/22/208088.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/208088.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2014/08/22/208088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/208088.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/208088.html</trackback:ping><description><![CDATA[<div>http://blog.163.com/hbu_lijian/blog/static/126129153201422902256778/</div><br /><div><div fc05="" fc11="" nbw-blog=""  ztag"=""><div>1.dofile与loadfile</div>dofile 当作Lua运行代码的chunk的一种原始的操作。dofile实际上是一个辅助的函数。真正完成功能的函数是loadfile；与dofile不同的是 loadfile编译代码成中间码并且返回编译后的chunk作为一个函数，而不执行代码；另外loadfile不会抛出错误信息而是返回错误代。我们可 以这样定义dofile：<wbr><div><div>function dofile (filename)</div><div>local f = assert(loadfile(filename))</div><div>return f()</div><div>end</div></div><div>如 果loadfile失败assert会抛出错误。loadfile更加灵活。在发生错误的情况下，loadfile返回nil和错误信息，这样我们就可以 自定义错误处理。另外，如果我们运行一个文件多次的话，loadfile只需要编译一次，但可多次运行。dofile却每次都要编译。</div><div>2.loadstring与loadfile</div><div>loadstring与loadfile相似，只不过它不是从文件里读入chunk，而是从一个串中读入。</div><div>f = loadstring("i = i + 1")</div><div>loadstring 函数功能强大，但使用时需多加小心。确认没有其它简单的解决问题的方法再使用。loadfile和loadstring都不会抛出错误，如果发生错误他们 将返回nil加上错误信息。另外，loadfile和loadstring都不会有边界效应产生，他们仅仅编译chunk成为自己内部实现的一个匿名函 数。通常对他们的误解是他们定义了函数。Lua中的函数定义是发生在运行时的赋值而不是发生在编译时。</div><div>loadstring通常用 于运行程序外部的代码，比如运行用户自定义的代码。注意：loadstring期望一个chunk，即语句。如果想要加载表达式，需要在表达式前加 return，那样将返回表达式的值。loadstring返回的函数和普通函数一样，可以多次被调用。</div><div><div>print "enter your expression:"</div><div>local l = io.read()</div><div>local func = assert(loadstring("return " .. l))</div><div>print("the value of your expression is " .. func())</div></div><div>3.require与dofile</div><div><div>。粗略的说require和dofile完成同样的功能但有两点不同：</div><div>1. require会搜索目录加载文件</div><div>2. require会判断是否文件已经加载避免重复加载同一文件。由于上述特征，require在Lua中是加载库的更好的函数。</div></div><div>require 使用的路径和普通我们看到的路径还有些区别，我们一般见到的路径都是一个目录列表。require的路径是一个模式列表，每一个模式指明一种由虚文件名 （require的参数）转成实文件名的方法。更明确地说，每一个模式是一个包含可选的问号的文件名。匹配的时候Lua会首先将问号用虚文件名替换，然后 看是否有这样的文件存在。如果不存在继续用同样的方法用第二个模式匹配。例如，路径如下：<span style="line-height: 28px;">?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua&nbsp;</span></div><div><span style="line-height: 28px;">调用过程如下：</span></div><div><div>lili</div><div>lili.lua</div><div>c:\windows\lili</div><div>/usr/local/lua/lili/lili.lua</div></div><div>还会有so/dll文件。</div><div>为了确定路径，Lua首先检查全局变量LUA_PATH是否为一个字符串，如果是则认为这个串就是路径；否则require检查环境变量LUA_PATH的值，如果两个都失败require使用固定的路径（典型的"?;?.lua"）</div><div>一个路径中的模式也可以不包含问号而只是一个固定的路径，比如：?;?.lua;/usr/local/default.lua。这种情况下，require没有匹配的时候就会使用这个固定的文件（当然这个固定的路径必须放在模式列表的最后才有意义）</div></div></div><img src ="http://www.cppblog.com/colorful/aggbug/208088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2014-08-22 09:24 <a href="http://www.cppblog.com/colorful/archive/2014/08/22/208088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> lua中的require机制</title><link>http://www.cppblog.com/colorful/archive/2014/08/21/208082.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 21 Aug 2014 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2014/08/21/208082.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/208082.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2014/08/21/208082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/208082.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/208082.html</trackback:ping><description><![CDATA[<div><div>http://blog.chinaunix.net/uid-552961-id-2736410.html</div><br />lua中的require机制<br /><br />&nbsp;&nbsp; &nbsp;为了方便代码管理，通常会把lua代码分成不同的模块，然后在通过require函数把它们加载进来。<br />现在看看lua的require的处理流程。<br /><br />1、require机制相关的数据和函数<br />&nbsp;&nbsp; &nbsp;package.path:保存加载外部模块(lua中"模块"和"文件"这两个概念的分界比较含糊，因为这个值在不同的时刻会扮演不同的角色)的搜索 路径，这种路径是"模板式的路径"，它里面会包含可替代符号"?",这个符号会被替换，然后lua查找这个文件是否存在，如果存在就会调用其中特定的接 口。典型的值为:<br />&nbsp;&nbsp; &nbsp;"./?.lua;./?.lc;/usr/local/?/init.lua"<br />&nbsp;&nbsp; &nbsp;如果lua代码中调用:require("hello.world")<br />&nbsp;&nbsp; &nbsp;那么lua会依次查找：<br />&nbsp;&nbsp; &nbsp;./hello/world.lua ==&gt;这里"hello.world"变成了"hello/world",并替换了模型"./?.lua"<br />&nbsp;&nbsp; &nbsp;./hello/world.lc<br />&nbsp;&nbsp; &nbsp;.....<br />&nbsp;&nbsp; &nbsp;(这种处理方式和python类似，只不过不需要__init__.py,也有调用python中的__init__.py)<br />&nbsp;&nbsp; &nbsp;package.path在虚拟机启动的时候设置，如果存在环境变量LUA_PATH，那么就用该环境变量作为<br />&nbsp;&nbsp; &nbsp;它的值，并把这个环境变量中的";;"替换为luaconf.h中定义的默认值，如果不存在该变量就直接使用<br />&nbsp;&nbsp; &nbsp;luaconf.h定义的默认值<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;package.cpath:作用和packag.path一样,但它是用于加载第三方c库的。它的初始值可以通过环境变量<br />&nbsp;&nbsp; &nbsp;LUA_CPATH来设置<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;package.loadlib(libname, func):相当与手工打开c库libname, 并导出函数func返回，loadlib其实是ll_loadlib<br />&nbsp;&nbsp; &nbsp;<br /><br />2.require的处理流程：<br />&nbsp;&nbsp; require(modelname)<br />&nbsp;&nbsp; require(在lua中它是ll_require函数)的查找顺序如下：<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;a.首先在package.loaded查找modelname,如果该模块已经存在，就直接返回它的值<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;b.在package.preload查找modelname, 如果preload存在，那么就把它作为loader，调用loader(L)<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;c.根据package.path的模式查找lua库modelname，这个库是通过module函数定义的，对于顶层的lua库，文件名和库名是一 样的而且不需要调用显式地在lua文件中调用module函数(在ll_require函数中可以看到处理方式)，也就是说lua会根据lua文件直接完 成一个loader的初始化过程。<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;d.根据package.cpath查找c库，这个库是符合lua的一些规范的(export具有一定特征的函数接口)，lua先已动态的方式加载该c库，然后在库中查找并调用相应名字的接口，例如:luaopen_hello_world<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.已第一个"."为分割，将模块名划分为:(main, sub)的形式，根据package.cpath查找main，如果存在，就加载该库并查询相应的接口:luaopen_main_sub，例如：先查找 hello库，并查询luaopen_hello_world接口<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;f.得到loder后，用modname作为唯一的参数调用该loader函数。当然参数是通过lua的栈传递的，所以loader的原型必须符合lua的规范:int LUA_FUNC(lua_State *L)<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ll_require会将这个loader的返回值符给package.loaded[modelname],如果loader不返回值同时 package.loaded[modelname]不存在时, ll_require就会把package.loaded[modelname]设为true。最后ll_reuqire把package.loaded [modelname]返回给调用者。<br />&nbsp;&nbsp; &nbsp;<br /><br />3.module的处理流程<br />&nbsp;&nbsp;&nbsp; module(name, cb1, cb2, ...)<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; a.如果package.loaded[name]是一个table，那么就把这个table作为一个mod<br />&nbsp;&nbsp;&nbsp; b.如果全局变量name是一个table，就把这个全局变量作为一个mod<br />&nbsp;&nbsp;&nbsp; c.创建table:t = {[name]=package.loaded[name], ["_NAME"]=name, ["_M"]=t, ["_PACKAGE"]=*name*(删除了最后的".XXXX"部分)}. 如果name是一个以点分割的串，那么得到的mod类似这个样子：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.world==&gt; {["hello"]={["world"]={XXXXXXX}}}<br />&nbsp;&nbsp;&nbsp; d.依次调用cbs：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cb1(mod), cb2(mod),...<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; e.将当前模块的环境设置为mod,同时把package.loaded[name] = mod&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;<br /><br />&nbsp; 清楚了lua关于模块的处理，就比较容易理解写lua扩展的细节了^_^。 		 		 		           </div><img src ="http://www.cppblog.com/colorful/aggbug/208082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2014-08-21 17:08 <a href="http://www.cppblog.com/colorful/archive/2014/08/21/208082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua学习</title><link>http://www.cppblog.com/colorful/archive/2014/08/08/207945.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Fri, 08 Aug 2014 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2014/08/08/207945.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/207945.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2014/08/08/207945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/207945.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/207945.html</trackback:ping><description><![CDATA[<div><p align="left">----------------------------------------------------------------------------------<br /></p><p align="left">头文件lua.h定义了Lua提供的基础函数。其中包括创建一个新的Lua环境的函数（如lua_open），调用 Lua函数（如lua_pcall）的函数，读取/写入Lua环境的全局变量的函数，注册可以被Lua代码调用的新函数的函数，等等。所有在lua.h中 被定义的都有一个lua_前缀。</p> <p align="left">头文件lauxlib.h定义了辅助库（auxlib）提供的函数。同样，所有在其中定义的函数等都以luaL_打头（例如，luaL_loadbuffer）。辅助库利用lua.h中提供的基础函数提供了更高层次上的抽象；所有Lua标准库都使用了auxlib。</p><p align="left"><br /></p><p align="left">----------------------------------------------------------------------------------</p><p align="left">在控制台 使用 require 老是失败</p><p align="left">后来发现要修改一下 package.path</p><p align="left">require搜索模块时是根据package.path设的路径来搜索的</p><p align="left"><br /></p><p align="left">require搜索路径</p><p align="left">package.path&nbsp;&nbsp; -- lua模块路径</p><p align="left">package.cpath&nbsp;&nbsp;&nbsp; -- dll so 库路径<br /></p><p align="left"><br /></p><p align="left">package.path = package.path..';d:\?.lua'</p><p align="left"><br /></p><p align="left">// require mylua.lua<br /></p><p align="left">require 'mylua'&nbsp; <br /></p><p align="left"><br /></p><p align="left">------------------------------------------------------------------------------------<br /></p></div><img src ="http://www.cppblog.com/colorful/aggbug/207945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2014-08-08 17:01 <a href="http://www.cppblog.com/colorful/archive/2014/08/08/207945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua5.1.5 安装</title><link>http://www.cppblog.com/colorful/archive/2013/07/16/201868.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 16 Jul 2013 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/16/201868.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201868.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/16/201868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201868.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201868.html</trackback:ping><description><![CDATA[<div>lua5.1.5 安装<br /><br />lua默认编译出的是静态库, 要生成动态库需作如下修改:<br />1: src/Makefile<br />&nbsp;&nbsp; 如果是64位系统, 在CFLAGS后加 -fPIC 参数<br />&nbsp;&nbsp; 在38行左右加 LUA_SO= liblua.so<br />&nbsp;&nbsp; ALL_T后加 $(LUA_SO)<br />&nbsp;&nbsp; 60行左右加生成规则: <br />&nbsp;&nbsp; $(LUA_SO): $(CORE_O) $(LIB_O)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(CC) -o $@ -shared $? -ldl -lm<br />2: lua根目录下的 Makefile<br />&nbsp;&nbsp; 修改TO_LIB 为 TO_LIB= liblua.a liblua.so<br /><br />修改完后开始安装<br />make linux<br />make install<br /><br />这样在lua根目录下会生成liblua.so, 将liblua.so copy到/usr/local/lib下<br />cp liblua.so /usr/local/lib<br /><br />这样就可以了<br /></div><img src ="http://www.cppblog.com/colorful/aggbug/201868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-16 16:54 <a href="http://www.cppblog.com/colorful/archive/2013/07/16/201868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua fPIC error</title><link>http://www.cppblog.com/colorful/archive/2013/04/23/199659.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 23 Apr 2013 06:50:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/04/23/199659.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/199659.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/04/23/199659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/199659.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/199659.html</trackback:ping><description><![CDATA[<div><p><strong><a title="" href="http://www.lua.org/" target="_blank"><strong>安装lua</strong></a></strong>：</p> <p>tar zxvf lua-5.1.4.tar.gz</p> <p>cd lua-5.1.4</p> <p>如果你的服务器是64位的，这时要调整一下Makefile：vi src/Makefile，在CFLAGS里加上-fPIC，否则会出错：</p> <p>/usr/bin/ld: /usr/local/lib/liblua.a(lapi.o):</p> <p>relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object;</p> <p>recompile with -fPIC</p> <p>/usr/local/lib/liblua.a: could not read symbols: Bad value</p> <p>接下来不用执行常见的configure，直接make：</p> <p>make linux</p> <p>make install</p></div><img src ="http://www.cppblog.com/colorful/aggbug/199659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-04-23 14:50 <a href="http://www.cppblog.com/colorful/archive/2013/04/23/199659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>luabind常用方法总结 </title><link>http://www.cppblog.com/colorful/archive/2012/10/18/193495.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 18 Oct 2012 15:45:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/10/18/193495.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/193495.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/10/18/193495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/193495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/193495.html</trackback:ping><description><![CDATA[<div>luabind比较复杂，功能包罗万象，但使用起来比较简单，特别是最常用的方法只有几个，下面结合一个简单的例子总结一下。 &nbsp;&nbsp; &nbsp;在我们游戏应用中，一般都是已c++为主导的，也就是说c++主动调用lua脚本。<br />  <div>先写一个比较常见的lua脚本：</div> <div><div bg_php"=""><div><div><strong>[php]</strong> <a href="http://blog.csdn.net/caoyanting007/article/details/5709820#" title="view plain">view plain</a><a href="http://blog.csdn.net/caoyanting007/article/details/5709820#" title="copy">copy</a></div></div><ol start="1"><li><span>nGlobal&nbsp;=&nbsp;10&nbsp;--一个全局的整形变量&nbsp;&nbsp;&nbsp;</span></li><li>strGlobal&nbsp;=&nbsp;<span>"hello&nbsp;i&nbsp;am&nbsp;in&nbsp;lua"&nbsp;--一个全局的字符串变量&nbsp;&nbsp;&nbsp;</span></li><li>--一个返回值为int类型的函数&nbsp;&nbsp;&nbsp;</li><li><span>function&nbsp;add(a,&nbsp;b)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;a+b&nbsp;&nbsp;&nbsp;</span></li><li><span>end&nbsp;&nbsp;&nbsp;</span></li><li>--一个返回值为string类型的函数&nbsp;&nbsp;&nbsp;</li><li><span>function&nbsp;strEcho(a)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;print(a)&nbsp;10&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;'haha&nbsp;i&nbsp;have&nbsp;print&nbsp;your&nbsp;input&nbsp;param'&nbsp;&nbsp;&nbsp;</span></li><li><span>end&nbsp;&nbsp;&nbsp;</span></li><li>cppapi.testFunc()&nbsp;--调用c++暴露的一个测试函数&nbsp;&nbsp;&nbsp;</li><li>t={name=<span>'ettan',&nbsp;age=23,&nbsp;desc='正值花季年龄'}&nbsp;&nbsp;</span></li></ol></div>&nbsp;</div>  <div>////////////////////////////////////lua脚本结束</div>  <div>下面写c++函数中的调用了</div>  <div><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/caoyanting007/article/details/5709820#" title="view plain">view plain</a><a href="http://blog.csdn.net/caoyanting007/article/details/5709820#" title="copy">copy</a></div></div><ol start="1"><li><span>#include&lt;iostream&gt;&nbsp;&nbsp;</span></li><li><span>#include&lt;string&gt;&nbsp;&nbsp;</span></li><li><span>using&nbsp;namespace&nbsp;std;&nbsp;&nbsp;</span></li><li><span>#include&lt;lua.hpp&gt;&nbsp;&nbsp;</span></li><li><span>#include&lt;luabind/function.hpp&gt;&nbsp;&nbsp;</span></li><li><span>void&nbsp;testFunc()&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span>"helo&nbsp;there,&nbsp;i&nbsp;am&nbsp;a&nbsp;cpp&nbsp;fun"&lt;&lt;endl;&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li><li><span>int&nbsp;main(int&nbsp;argc,&nbsp;char*&nbsp;argv[])&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>//首先声明luaState环境&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>using&nbsp;namespace&nbsp;luabind;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;lua_State*&nbsp;L&nbsp;=&nbsp;lua_open();&nbsp;&nbsp;<span>//也可以用luaL_newState()函数&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;luaL_openlibs(L);&nbsp;&nbsp;&nbsp;<span>//注意将lua默认库打开，要不会出现N多错误的，比如print函数都没有&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>//将c++中的函数暴露给lua&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;module(L,&nbsp;<span>"cppapi")&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def(<span>"testFunc",&nbsp;(void(*)(void))testFunc)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;];&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>//加载lua脚本，我们临时起名test.lua&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;luaL_dofile(L,&nbsp;<span>"test.lua");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>try&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//调用lua中的整形全局变量&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;nLuaGlobal&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;luabind::object_cast&lt;int&gt;(luabind::globals(L)["nGlobal"])&nbsp;;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//调用lua中的字符串变量&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;strLuaGlobal&nbsp;=&nbsp;luabind::object_cast&lt;string&gt;(luabind::globals(L)[<span>"strGlobal"]);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//获取table,方法一，通过luabind::object&nbsp;固有方法&nbsp;&nbsp;</span></li><li>luabind::object&nbsp;luaTable&nbsp;=&nbsp;luabind::globals(L)[<span>"t"]&nbsp;;&nbsp;&nbsp;</span></li><li>string&nbsp;name=luabind::object_cast&lt;string&gt;(luaTable[<span>"name"])&nbsp;;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;age&nbsp;=&nbsp;luabind::object_cast&lt;int&gt;(luaTable["age"])&nbsp;;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//获取table，方法二，通过gettable&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;desc&nbsp;=&nbsp;luabind::object_cast&lt;string&gt;(luabind::gettable(luaTable,<span>"desc"));&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//下面是调用lua中函数&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;nAddRes&nbsp;=&nbsp;luabind::call_function&lt;int&gt;(L,&nbsp;"add",&nbsp;3,&nbsp;4)&nbsp;;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;strEchoRes&nbsp;=&nbsp;luabind::call_function&lt;string&gt;(L,&nbsp;<span>"strEcho",&nbsp;"c++参数")&nbsp;;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>catch(...)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span>"error"&lt;&lt;endl;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;0;&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li></ol></div>&nbsp;</div>  <div>&nbsp;&nbsp; &nbsp;我们目前常用的方法暂时就有这些，当然在实际编码中，c++暴露给lua的经常是c++类中的函数，只要稍加修改就行！</div></div><img src ="http://www.cppblog.com/colorful/aggbug/193495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-10-18 23:45 <a href="http://www.cppblog.com/colorful/archive/2012/10/18/193495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 下安装luabind</title><link>http://www.cppblog.com/colorful/archive/2012/09/25/191985.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 25 Sep 2012 12:11:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/09/25/191985.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/191985.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/09/25/191985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/191985.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/191985.html</trackback:ping><description><![CDATA[<div>&nbsp; luabind需要boost 和lua, 请先安装boost, lua<br />&nbsp; luabind用到lua的动态库，请在安装lua时编译出 liblua.so<br /><br />&nbsp; a: export BOOST_ROOT=/home/zc/tools/boost_1_48_0<br /> &nbsp; b: export LUA_PATH=/usr/local/<br /> &nbsp; c: bjam stage --toolset=gcc --with-date_time --with-fpic --with-filesystem link=static debug release&nbsp; --这一步可以不要<br /> &nbsp; d: bjam install</div><img src ="http://www.cppblog.com/colorful/aggbug/191985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-09-25 20:11 <a href="http://www.cppblog.com/colorful/archive/2012/09/25/191985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于lua5.1.4找不到luaL_openlibs的问题</title><link>http://www.cppblog.com/colorful/archive/2012/09/25/191982.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 25 Sep 2012 11:53:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/09/25/191982.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/191982.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/09/25/191982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/191982.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/191982.html</trackback:ping><description><![CDATA[忙了一下午，最后才发现是src/Makefile里少数据<br /><div><div>LUAC_T=&nbsp;&nbsp; &nbsp;luac<br />LUAC_O=&nbsp;&nbsp; &nbsp;luac.o print.o<br />LUA_SO= liblua.so<br /><br />ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)<br />ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)<br />ALL_A= $(LUA_A)<br /><br />default: $(PLAT)<br /><br />all:&nbsp;&nbsp; &nbsp;$(ALL_T)<br /><br />o:&nbsp;&nbsp; &nbsp;$(ALL_O)<br /><br />a:&nbsp;&nbsp; &nbsp;$(ALL_A)<br /><br />$(LUA_A): $(CORE_O) $(LIB_O)<br />&nbsp;&nbsp; &nbsp;$(AR) $@ $?<br />&nbsp;&nbsp; &nbsp;$(RANLIB) $@<br /><br />$(LUA_T): $(LUA_O) $(LUA_A)<br />&nbsp;&nbsp; &nbsp;$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)<br /><br />$(LUAC_T): $(LUAC_O) $(LUA_A)<br />&nbsp;&nbsp; &nbsp;$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)<br /><br />$(LUA_SO):$(CORE_O) $(LIB_O)<br />&nbsp;&nbsp; &nbsp;$(CC) -o $@ -shared -fPIC $? -ldl -lm<br /></div></div><img src ="http://www.cppblog.com/colorful/aggbug/191982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-09-25 19:53 <a href="http://www.cppblog.com/colorful/archive/2012/09/25/191982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua 安装</title><link>http://www.cppblog.com/colorful/archive/2012/09/25/191949.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 25 Sep 2012 06:23:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/09/25/191949.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/191949.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/09/25/191949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/191949.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/191949.html</trackback:ping><description><![CDATA[<div>下载源文件<br />tar zxvf lua.tar.gz<br />make linux<br />make install<br /><br />提示找不到readline/readline.h<br />apt-get install libncurses5-dev libreadline5-dev</div><img src ="http://www.cppblog.com/colorful/aggbug/191949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-09-25 14:23 <a href="http://www.cppblog.com/colorful/archive/2012/09/25/191949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>