??xml version="1.0" encoding="utf-8" standalone="yes"?>久久乐国产综合亚洲精品,日产精品久久久久久久,久久久精品久久久久久http://www.shnenglu.com/singohgod/category/4053.html每天晚上入睡Q都迎来崭新的明天Q这是梦想Q?大宝天天?/description>zh-cnWed, 17 Nov 2010 00:07:56 GMTWed, 17 Nov 2010 00:07:56 GMT60[摘录]rapidxml,一个快速的xml?/title><link>http://www.shnenglu.com/singohgod/archive/2010/11/15/133685.html</link><dc:creator>大宝天天?/dc:creator><author>大宝天天?/author><pubDate>Mon, 15 Nov 2010 09:24:00 GMT</pubDate><guid>http://www.shnenglu.com/singohgod/archive/2010/11/15/133685.html</guid><wfw:comment>http://www.shnenglu.com/singohgod/comments/133685.html</wfw:comment><comments>http://www.shnenglu.com/singohgod/archive/2010/11/15/133685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/singohgod/comments/commentRss/133685.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/singohgod/services/trackbacks/133685.html</trackback:ping><description><![CDATA[q来扑ֈ一个快速的xml?试用了一?Ҏ(gu)和现在用的tinyxml差不?很容易上?如果有机会可以移植到目里面试试<br><br>自从用了xml后对他是又爱又恨,他的能代替配置文g,但是当文件容量大C定量的时候灾隑ְ降?比如d一?0M的xml文g,往往d׃10U?解析再花?0U?q要占用大量内存I间,十分头痛.所以实际项目中都会xml再{Zq制文g来处?但是xml的灵zL的很方便,如果rapidxml能接q二q制的速度,当然太好啦,q没有测试过,下面是一些介l?<br><br>貌似tinyxml会遇到unicode障碍,rapidxml不会,如果目要做多语a版本必面临解册个问?..<br><br> <hr> <br>rapidxml是一个快速的xml库,官方|站Q?<a >http://rapidxml.sourceforge.net/</a>Q根据manual看到Q他竟然比tinyxml快了50-100?br><br> <hr> <p>目前我公司开发的Nexus Engine的底层对象序列化使用了TinyXML来读写XML文g。TinyXML有两个不爽的地方Q一是它的接口用FILE*Q另外一个是它对 wchar_t不能很好的支持。前阵子看Boost库的更新中多了一个PropertyTreeQ他在处理XML时用C另外一个小的库 –RapidXML。既焉接的是Boost库的一部分Q所以是值得一试的。于是找到其官方|站Q?a title=http://rapidxml.sourceforge.net/ target=_blank><font color=#5c7a99>http://rapidxml.sourceforge.net/</font></a>Q研I了一番。一看之下,甚是满意Q也推荐l大家看看!</p> <p>首先是速度Q据它自己宣U比TinyXML?0?0倍,比Xerces DOM?0?00倍!详细的测试比较请见其用户手册Q?a title=http://rapidxml.sourceforge.net/manual.html target=_blank><font color=#5c7a99>http://rapidxml.sourceforge.net/manual.html</font></a>Q的“4. Performance ”一节?/p> <p>其次它的设计非常的简z,只依赖于标准库中的几个基本的cR它的输入输出都是字W串Q这样很好,一个库应该关注自己核心的内容Q做量的事情。它的API其实和TinyXML倒是有几分相|用过TinyXML的h应该很容易上手:</p> <p>TinyXML主要接口c?    RapidXML的主要接口类</p> <table cellSpacing=1 cellPadding=2 width=543 border=1> <tbody> <tr> <td vAlign=top width=300><strong>TinyXML主要接口c?/strong></td> <td vAlign=top width=238><strong>RapidXML的主要接口类</strong></td> </tr> <tr> <td width=300>class TiXmlDocument</td> <td vAlign=top width=238>template<class Ch = char><br>class xml_document</td> </tr> <tr> <td vAlign=top width=300>class TiXmlNode</td> <td vAlign=top width=238>template<class Ch = char><br>class xml_node</td> </tr> <tr> <td vAlign=top width=300>class TiXmlAttribute</td> <td vAlign=top width=238>template<class Ch = char><br>class xml_attribute</td> </tr> </tbody> </table> <p>下面q是看一个具体的例子来体验一下,下面是TinyXML官方教程中创建XML文档的一D代码:</p> <blockquote> <p>void build_simple_doc( )<br>{<br>// Make xml: <?xml ..><Hello>World</Hello><br>TiXmlDocument doc;<br>TiXmlDeclaration * decl = new TiXmlDeclaration( “1.0″, “”, “” );<br>TiXmlElement * element = new TiXmlElement( “Hello” );<br>TiXmlText * text = new TiXmlText( “World” );<br>element->LinkEndChild( text );<br>doc.LinkEndChild( decl );<br>doc.LinkEndChild( element );<br>doc.SaveFile( “madeByHand.xml” );<br>}</p> </blockquote> <p>下面是用RapidXML实现cM功能的代码:</p> <blockquote> <p>void build_simple_doc_by_rapidxml()<br>{<br>xml_document<> doc;<br>xml_node<>* decl = doc.allocate_node(node_declaration);<br>xml_attribute<>* decl_ver =<br>doc.allocate_attribute(“version”, “1.0″);<br>decl->append_attribute(decl_ver);<br>doc.append_node(decl);</p> <p>xml_node<>* node =<br>doc.allocate_node(node_element,    “Hello”, “World”);<br>doc.append_node(node);</p> <p>string text;<br>rapidxml::print(std::back_inserter(text), doc, 0);</p> <p>// write text to file by yourself<br>}</p> </blockquote> <p>下面是用RapidXML分析XML的样例代码:</p> <blockquote> <p>void parse_doc_by_rapidxml(char* xml_doc)<br>{<br>xml_document<> doc;        // character type defaults to char<br>doc.parse<0>(xml_doc);  // 0 means default parse flags</p> <p>xml_node<> *node = doc.first_node(“Hello”);<br>string node_val = node->value();<br>}</p> </blockquote><br> <hr> <p>前两天有朋友问,我的<a target=_blank><span style="COLOR: #0000ff">SlimXml</span></a>有没有和<a target=_blank><span style="COLOR: #0000ff">RapidXml</span></a>Ҏ(gu)q效率?我是W一ơ听说这个库Q更不用说对比效率了Q于是上他们|站看了下?/p> <p>好家伙,居然L?a target=_blank><span style="COLOR: #0000ff">TinyXml</span></a>?0?0倍,而且?a ><span style="COLOR: #0000ff">Boost.PropertyTree</span></a>的默认xml解析器?/p> <p>于是有点好奇Q因Z前也没有特别兛_qSlimXml的效率?/p> <p>于是分别下蝲了TinyXml-2.6.1和RapidXml-1.13Q迅速用vc8建立了两个测试工E,在系l中?#8221;*.xml”Q找C一个比较合适的试文g。它_大(1.5MQ,utf-8~码q且包含?英文Q有一定层ơ深度,大约3.3万行。测试文件可?a target=_blank><span style="COLOR: #0000ff">从这里下?/span></a></p> <p>试对象是三个库从内存字W串解析xml的函敎ͼq样能排除从盘上读文gq种不稳定因素的q扰Q而且RapidXml貌似只支持从内存里解?/p> <ul> <li>slim::XmlDocument::loadFromMemory() <li>TiXmlDocument::Parse() <li>rapidxml::xml_document<char>::parse<flag>() </li> </ul> <p>要说明的是,RapidXml的这个parse是一个模板函敎ͼ必须l一个flag的参敎ͼ我测试的时候给的是默认?</p> <p>试l果Q解析这?.3万行Q?.5M大小的xmlQ三个库分别׃</p> <ul> <li>SlimXml: 22ms <li>TinyXml: 54ms <li>RapidXml: 4ms! </li> </ul> <p>l论是,RapidXml果然很强(zhn),居然比我的SlimXml?倍多。但是ƈ没有如作者所说比TinyXml?0~60倍,只有不到15倍。据说对比用的是一个约50k大小的xml文gQ可惜ƈ没有提供下蝲Q不然可以验证一下?/p> <p>比较ƣ慰的是Q在我ƈ没有很关注效率的情况下,SlimXml仍然比TinyXml?.5倍。SlimXml走的是简单小巧\U,源代码只?2kQ而TinyXml和RapidXml的源码分别是147k?41kQ有q样的效率可以满意了。在我有很多I闲以前Q估计我也不会再M化它Q因个库主要q是针对几十上百行的文Ӟ解析特别大的xml不在我考虑的范围之内?/p> <p>以下是RapidXml提供的常见xml库效率对照表Q其中还很牛d提供了和strlen()函数的效率对?/p> <p><a ><img class="alignnone size-full wp-image-279" title=xml height=275 src="http://hiphotos.baidu.com/5iprog/pic/item/1878fd197c684c4235fa4182.jpg" width=582></a></p> <p>我估计RapidXml速度快的主要原因是对memory pool的用,毕竟在解析过E中需要创建大量的stringQ可以想象用memory pool和直接走默认的new很容易生超q一个数量的效率差异?/p> <br> <hr> <br><br><br><br><br><br> <img src ="http://www.shnenglu.com/singohgod/aggbug/133685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/singohgod/" target="_blank">大宝天天?/a> 2010-11-15 17:24 <a href="http://www.shnenglu.com/singohgod/archive/2010/11/15/133685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]介绍LuaPlus: 好用的Lua For C++扩展(修订)http://www.shnenglu.com/singohgod/archive/2010/11/15/133678.html大宝天天?/dc:creator>大宝天天?/author>Mon, 15 Nov 2010 09:11:00 GMThttp://www.shnenglu.com/singohgod/archive/2010/11/15/133678.htmlhttp://www.shnenglu.com/singohgod/comments/133678.htmlhttp://www.shnenglu.com/singohgod/archive/2010/11/15/133678.html#Feedback0http://www.shnenglu.com/singohgod/comments/commentRss/133678.htmlhttp://www.shnenglu.com/singohgod/services/trackbacks/133678.html阅读全文

]]>
[转蝲]Lua脚本语法说明(修订)http://www.shnenglu.com/singohgod/archive/2010/11/15/133676.html大宝天天?/dc:creator>大宝天天?/author>Mon, 15 Nov 2010 09:05:00 GMThttp://www.shnenglu.com/singohgod/archive/2010/11/15/133676.htmlhttp://www.shnenglu.com/singohgod/comments/133676.htmlhttp://www.shnenglu.com/singohgod/archive/2010/11/15/133676.html#Feedback0http://www.shnenglu.com/singohgod/comments/commentRss/133676.htmlhttp://www.shnenglu.com/singohgod/services/trackbacks/133676.html
Lua脚本语法说明Q增加lua5.1部䆾Ҏ(gu))

  Lua 的语法比较简单,学习h也比较省力,但功能却q不弱?br>  所以,我只单的归纳一下Lua的一些语法规则,使用h方便好查可以了。估计看完了Q就懂得怎么写LuaE序了?br>
  在Lua中,一切都是变量,除了关键字?br>
I.  首先是注?br>  写一个程序,L不了注释的?br>  在Lua中,你可以用单行注释和多行注释?br>  单行注释中,q箋两个减号"--"表示注释的开始,一直gl到行末为止。相当于C++语言中的"http://"?br>  多行注释中,?--[["表示注释开始,q且一直gl到"]]"为止。这U注释相当于C语言中的"/*...*/"。在注释当中Q?[["?]]"是可以嵌套的Q?span style="COLOR: red">在lua5.1中,中括号中间是可以加若q个"="LQ如 [==[ ... ]==]Q,见下面的字符串表C明?br>
II.  Lua~程
  l典?Hello world"的程序L被用来开始介l一U语a。在Lua中,写一个这LE序很简单:
  print("Hello world")
  在Lua中,语句之间可以用分?Q?隔开Q也可以用空白隔开。一般来_如果多个语句写在同一行的话,L用分号隔开?br>  Lua 有好几种E序控制语句Q如Q?br>
控制语句 格式 CZ
If if 条g then ... elseif 条g then ... else ... end
if 1+1=2 then print("true")
elseif 1+2~=3 then print("true")
else print("false"end

While while 条g do ... end
while 1+1~=2 do print("true"end

Repeat repeat ... until 条g
repeat print("Hello"until 1+1~=2

For for 变量=初? l点? 步进 do ... end
for i = 1102 do print(i) end

For for 变量1, 变量2, ... 变量n in 表或枚D函数 do ... end
for a,b in mylist do print(a, b) end


  注意一下,for的@环变量L只作用于for的局部变量;当省略步q值时Qfor循环会?作ؓ步进倹{?br>  使用break可以用来中止一个@环?br>  相对C语言来说QLua有几个地Ҏ(gu)明显不同的,所以面要特别注意一下:

  Q?strong>语句?/strong>
    语句块在C中是?{"?}"括v来的Q在Lua中,它是用do ?end 括v来的。比如:
    do print("Hello") end
    可以?函数 中和 语句?/strong> 中定局部变量?br>
  Q?strong>赋D?/strong>
    赋D句在Lua被强化了。它可以同时l多个变量赋倹{?br>    例如Q?br>    a,b,c,d=1,2,3,4
    甚至是:
    a,b=b,a  -- 多么方便的交换变量功能啊?br>    在默认情况下Q变量L认ؓ是全局的。假如需要定义局部变量,则在W一ơ赋值的时候,需要用local说明。比如:
    local a,b,c = 1,2,3  -- a,b,c都是局部变?br>
  Q?strong>数D?/strong>
    和C语言一P支持 +, -, *, /。但Luaq多了一?^"。这表示指数乘方q算。比?^3 l果?, 2^4l果?6?br>    q接两个字符Ԍ可以?.."q处W。如Q?br>    "This a " .. "string." -- {于 "this a string"

  Q?strong>比较q算
比较W号 < > <= >= == ~=
含义 大于 于或等?/td> 大于或等?/td> 相等 不相{?/td>

    所有这些操作符Lq回true或false?br>    对于TableQFunction和Userdatacd的数据,只有 == ?~=可以用。相{表CZ个变量引用的是同一个数据。比如:
    a={1,2}
    b
=a
    
print(a==b, a~=b)  --输出 true, false
    a={1,2}
    b
={1,2}
    
print(a==b, a~=b)  --输出 false, true


  Q逻辑q算
    and, or, not
    其中Qand ?or 与C语言区别特别大?br>    在这里,请先CQ在Lua中,只有false和nil才计ؓfalseQ其它Q何数据都计算为trueQ?也是trueQ?br>    and ?or的运结果不是true和falseQ而是和它的两个操作数相关?br>    a and bQ如果a为falseQ则q回aQ否则返回b
    a or bQ如?a 为trueQ则q回aQ否则返回b

    丑և个例子:
     print(4 and 5--输出 5
     print(nil and 13--输出 nil
     print(false and 13--输出 false
     print(4 or 5--输出 4
     print(false or 5--输出 5

    在Lua中这是很有用的特性,也是比较令hh的特性?br>    我们可以模拟C语言中的语句Qx = a? b : cQ在Lua中,可以写成Qx = a and b or c?br>    最有用的语句是Q?x = x or vQ它相当于:if not x then x = v end ?br>
  Q运符优先U,从低到高序如下Q?br>
     or
     and
     <     >     <=    >=    ~=    ==
     .. (字符串连?
     +     -
     *     /     %
     not   #(lua5.1 取长度运?/span>)     - (一元运?
     ^
和C语言一P括号可以改变优先U?br>
III.  关键?br>  关键字是不能做ؓ变量的。Lua的关键字不多Q就以下几个Q?br>    
and break do else elseif
end false for function if
in local nil not or
repeat return then true until while

IV.  变量cd
  怎么定一个变量是什么类型的呢?大家可以用type()函数来检查。Lua支持的类型有以下几种Q?br>
Nil I|所有没有用过的变量,都是nil。nil既是|又是cd?/td>
Boolean 布尔|只有两个有效|true和false
Number 数|在Lua里,数值相当于C语言的double
String 字符Ԍ如果你愿意的话,字符串是可以包含"\0"字符的(q和C语言L?\0"l尾是不一LQ?/td>
Table 关系表类型,q个cd功能比较强大Q请参考后面的内容?/td>
Function 函数cdQ不要怀疑,函数也是一U类型,也就是说Q所有的函数Q它本n是一个变量?/td>
Userdata 嗯,q个cd专门用来和Lua的宿L交道的。宿主通常是用C和C++来编写的Q在q种情况下,Userdata可以是宿ȝL数据cdQ常用的有Struct和指针?/td>
Thread U程cdQ在Lua中没有真正的U程。Lua中可以将一个函数分成几部䆾q行?/span>如果感兴的话,可以ȝ看Lua的文档?br>现在回过头来看看Q倒觉得不是线E类型。反而象是用来做遍历的,象是Iterator函数?br>如:
function range(n)
  local
= 0
  
while(i < n) do
    coroutine.yield( i )
    i = i + 1
  
end
end
可惜的是要l运行,需要coroutine.resume函数Q有炚w肋。请指教?br>

V.  变量的定?br>  所有的语言Q都要用到变量。在Lua中,不管在什么地方用变量,都不需要声明,q且所有的q些变量L全局变量Q除非我们在前面加上"local"。这一点要特别注意Q因为我们可能想在函数里使用局部变量,却忘了用local来说明?br>  至于变量名字Q它是大写相关的。也是_A和a是两个不同的变量?br>  定义一个变量的Ҏ(gu)是赋倹{?Q?操作是用来赋值的
  我们一h定义几种常用cd的变量吧?br>  A.  Nil
    正如前面所说的Q没有用过的变量的|都是Nil。有时候我们也需要将一个变量清除,q时候,我们可以直接l变量赋以nil倹{如Q?br>
    var1=nil  -- h?nbsp;nil 一定要写

  B.  Boolean
    布尔值通常是用在进行条件判断的时候。布?yu)值有两种Qtrue ?false。在Lua中,只有false和nil才被计算为falseQ而所有Q何其它类型的|都是true。比?Q空串等{,都是true。不要被 C语言的习惯所误导Q?在Lua中的的确是true。你也可以直接给一个变量赋以Booleancd的|如:
    theBoolean = true

  C.  Number
    在Lua中,是没有整数类型的Q也不需要。一般情况下Q只要数g是很大(比如不超q?00,000,000,000,000Q,是不会生舍入误差的。在WindowsXP能跑的当今主PC上,实数的运ƈ不比整数慢?br>    实数的表C方法,同C语言cMQ如Q?br>    4 0.4 4.57e-3 0.3e12 5e+20

  D.  String
    字符ԌL一U非常常用的高cd。在Lua中,我们可以非常方便的定义很长很长的字符丌Ӏ?br>    字符串在Lua中有几种Ҏ(gu)来表C,最通用的方法,是用双引h单引h括v一个字W串的,如:
    "That's go!"
    ?br>    'Hello world!'

    和C语言相同的,它支持一些{义字W,列表如下Q?br>    \a  bell
    \b  back space
    \f  form feed
    \n  newline
    \r  carriage return
    \t  horizontal tab
    \v  vertical tab
    \\  backslash
    \"  double quote
    \"  single quote
    \[  left square bracket
    \]  right square bracket

    ׃q种字符串只能写在一行中Q因此,不可避免的要用到转义字符。加入了转义字符的串Q看h实在是不敢恭l_比如Q?br>    "one line\nnext line\n\"in quotes\", "in quotes""
    一大堆?\"W号让h看v来很倒胃口。如果你与我有同感,那么Q我们在Lua中,可以用另一U表C方法:?[["?]]"多行的字符串括h。(lua5.1: 中括号中间可以加入若q个"="P?[==[ ... ]==]Q详见下面示?/span>Q?br>    CZQ下面的语句所表示的是完全相同的字W串Q?br>
= 'alo\n123"'
= "alo\n123\""
= '\97lo\10\04923"'
= [[alo
123"
]]
= [==[
alo
123"
]==]

    值得注意的是Q在q种字符串中Q如果含有单独用的"[["?]]"׃然得?\["?\]"来避免歧义。当Ӟq种情况是极会发生的?br>
  E.  Table
    关系表类型,q是一个很强大的类型。我们可以把q个cd看作是一个数l。只是C语言的数l,只能用正整数来作索引Q在Lua中,你可以用Lcd来作数组的烦引,除了nil。同P在C语言中,数组的内容只允许一U类型;在Lua中,你也可以用Q意类型的值来作数l的内容Q除了nil?br>    Table的定义很单,它的主要特征是用"{"?}"来括起一pd数据元素的。比如:
    T1 = {}  -- 定义一个空?/span>
    T1[1]=10  -- 然后我们可以象C语言一h使用它了?/span>

    T1["John"]={Age=27, Gender="Male"}
    q一句相当于Q?br>    T1
["John"]={}  -- 必须先定义成一个表Q还记得未定义的变量是nilcd?/span>
    T1["John"]["Age"]=27
    T1
["John"]["Gender"]="Male"
    当表的烦引是字符串的时候,我们可以写成Q?br>    T1.John
={}
    T1.John.Age
=27
    T1.John.Gender
="Male"
    ?br>    T1.John{Age
=27, Gender="Male"}
q是一个很强的Ҏ(gu)?br>
    在定义表的时候,我们可以把所有的数据内容一起写?{"?}"之间Q这样子是非常方便,而且很好看。比如,前面的T1的定义,我们可以q么写:
    T1=
    {
      
10,  -- 相当?nbsp;[1] = 10
      [100] = 40,
      John
=  -- 如果你原意,你还可以写成Q["John"] =
      {
        Age
=27,   -- 如果你原意,你还可以写成Q["Age"] =27
        Gender=Male   -- 如果你原意,你还可以写成Q["Gender"] =Male
      },
      
20  -- 相当?nbsp;[2] = 20
    }

    看v来很漂亮Q不是吗Q我们在写的时候,需要注意三点:
    W一Q所有元素之_L用逗号"Q?隔开Q?br>    W二Q所有烦引值都需要用"["?]"括v来;如果是字W串Q还可以L引号和中括号Q?br>    W三Q如果不写烦引,则烦引就会被认ؓ是数字,q按序自动?往后编Q?br>
    表类型的构造是如此的方便,以致于常常被人用来代曉K|文件。是的,不用怀疑,它比ini文g要漂亮,q且强大的多?br>
  F.  Function
    函数Q在Lua中,函数的定义也很简单。典型的定义如下Q?br>
    function add(a,b)  -- add 是函数名字,a和b是参数名?/span>
     return a+b  -- return 用来q回函数的运行结?/span>
    end

    h意,return语言一定要写在end之前。假如我们非要在中间放上一句returnQ那么就应该要写成:do return end?br>    q记得前面说q,函数也是变量cd吗?上面的函数定义,其实相当于:
    add = function (a,b) return a+end
当重新给add赋值时Q它?yu)׃再表C个函C。我们甚臛_以赋laddL数据Q包括nil Q这P赋gؓnilQ将会把该变量清除)。Function是不是很象C语言的函数指针呢Q?br>
    和C语言一PLua的函数可以接受可变参C敎ͼ它同h?..."来定义的Q比如:
    function sum (a,b,)
如果惛_?..所代表的参敎ͼ可以在函C讉Ka(chn)rg局部变量(表类型)得到 (lua5.1: 取消argQƈ直接?..."来代表可变参CQ本质还是arg)?br>    ?sum(1,2,3,4)
    则,在函CQa = 1, b = 2, arg = {3, 4}  (lua5.1:  a = 1, b = 2, ... = {3, 4})
    更可늚是,它可以同时返回多个结果,比如Q?br>
    function s()
      
return 1,2,3,4
    
end
    a,b,c,d 
= s()  -- 此时Qa = 1, b = 2, c = 3, d = 4

    前面说过Q表cd可以拥有Lcd的|包括函数Q因此,有一个很强大的特性是Q拥有函数的表,哦,我想更恰当的应该说是对象吧。Lua可以使用面向对象~程了。不信?举例如下Q?br>
    t =
    {
     Age 
= 27
     
add = function(self, n) self.Age = self.Age+end
    }
    
print(t.Age)  -- 27
    t.add(t, 10)
    
print(t.Age)  -- 37

    不过Qt.add(t,10) q一句实在是有点土对吧?没关p,在Lua中,我们可以写成Q?br>
    t:add(10)    -- 相当?nbsp;t.add(t,10)

  G.  Userdata ?Thread
    q两个类型的话题Q超Z本文的内容,׃打算l说了?br>
VI.  l束?br>  p么结束了吗?当然不是Q接下来Q我们需要用Lua解释器,来帮助理解和实践了。相信这样会更快的对Lua上手了?br>  pC语言一PLua提供了相当多的标准函数来增强语言的功能。用这些标准函敎ͼ可以很方便的操作各种数据cdQƈ处理输入输出。有兌斚w的信息,我们可以参考《Programming in Lua 》一书,也可以在|络上直接观看电(sh)子版Q网址为:http://www.lua.org/pil/index.html
  
备注Q本文的部䆾内容摘、译自lua随机文档?br>相关链接Q?br>1. Lua 官方|站Q?http://www.lua.org
2. Lua Wiki|站Q你可以在这里找到很多相关的资料Q如文档、教E、扩展,以及C/C++的包装等Q?http://lua-users.org/wiki/
3. Lua 打包下蝲Q包括各U^台和~译器的工程文g如vs2003,vs2005Q:http://luabinaries.luaforge.net/download.html

q是我编译好的Lua5.02的解释器Q?a >http://files.cnblogs.com/ly4cn/lua.zip

]]>
[原创]LuaPlus上手指南(1)http://www.shnenglu.com/singohgod/archive/2007/04/16/22069.html大宝天天?/dc:creator>大宝天天?/author>Mon, 16 Apr 2007 15:22:00 GMThttp://www.shnenglu.com/singohgod/archive/2007/04/16/22069.htmlhttp://www.shnenglu.com/singohgod/comments/22069.htmlhttp://www.shnenglu.com/singohgod/archive/2007/04/16/22069.html#Feedback11http://www.shnenglu.com/singohgod/comments/commentRss/22069.htmlhttp://www.shnenglu.com/singohgod/services/trackbacks/22069.htmlLuaPlus上手指南(1)

 

 

版权所?span lang=EN-US>,转蝲h明出?span lang=EN-US>,勿用于商业用?span lang=EN-US>,谢谢!

作?span lang=EN-US>:    大宝天天?span lang=EN-US>

Blog:    http://www.shnenglu.com/singohgod

本h水^有限,有错h?span lang=EN-US>,Ƣ迎交流,共同q步!

 

国内关于Lua的资料实在是太少,ZL一个合适的Lua?/span>C++,真是如同大v捞针.在看了众多资料后锁定以下几种:LuaBind ToLua++ LuaPlus.在选择上颇有讽刺的味道,LuaBind的版本号q没?/span>1.0,加上|友颇有微词,攑ּ.ToLua++本来有朋友推?/span>,但是怎么都找不到下蝲,官网是打不开,无赖攑ּ.只?/span>LuaPlus?/span>,看到一些h的评仯?/span>,于是军_q它吧.

LuaPlus的资料就更少?/span>,q怎么配置怎么调试{什么都没有,只有沐枫大哥讲解了语法方面的一文?/span>.啊哟,怎么搞呢,N又只有硬着头皮上了?(某伟人曾说过,但凡杰出的事都是着头皮q出来滴)

好了,a归正?/span>,下面讲讲我的l验?/span>:

 

如何~译

1.       下蝲

首先到官方网站下?/span>: http://www.luaplus.org/

下蝲q个: All source code: http://luaplus.org/LuaPlus51_Build1100.zip (我当前的版本,当然新好)

 

2.       剥离

解开下蝲?/span>,打开 \LuaPlus51_Build1100\Src\LuaPlus 里面是全部源文g,src下是lua的源文g.q里有个令h疑惑的地?/span>,源文件中带了一些不需要的文g,要剔除去,基本上需要以下这些文?/span>:

1)      Lua库文?/span>:

lapi.c

lapi.h

lauxlib.c

lauxlib.h

lbaselib.c

lcode.c

lcode.h

ldblib.c

ldebug.c

ldebug.h

ldo.c

ldo.h

ldump.c

lfunc.c

lfunc.h

lgc.c

lgc.h

linit.c

liolib.c

llex.c

llex.h

llimits.h

lmathlib.c

lmem.c

lmem.h

loadlib.c

lobject.c

lobject.h

lopcodes.c

lopcodes.h

loslib.c

lparser.c

lparser.h

lstate.c

lstate.h

lstring.c

lstring.h

lstrlib.c

ltable.c

ltable.h

ltablib.c

ltm.c

ltm.h

lua.h

luaconf.h

lualib.h

lundump.c

lundump.h

lvm.c

lvm.h

lzio.c

lzio.h

print.c

 

2)      LuaPlus头文?/span>:

auxiliar.h

LuaAutoBlock.h

LuaCall.h

LuaFunction.h

LuaHelper.h

LuaHelper_Object.h

LuaHelper_StackObject.h

LuaLink.h

LuaObject.h

LuaObject.inl

LuaPlus.h

LuaPlusCD.h

LuaPlusFunctions.h

LuaPlusInternal.h

LuaStackObject.h

LuaStackObject.inl

LuaStackTableIterator.h

LuaState.h

LuaState.inl

LuaStateOutFile.h

LuaTableIterator.h

luathread.h

pt.h

srm.h

 

3)      LuaPlus源文?/span>

LuaCall.cpp

LuaObject.cpp

LuaPlus.cpp

LuaPlusAddons.c

LuaPlusFunctions.cpp

LuaPlus_Libs.cpp

LuaStackObject.cpp

LuaStackTableIterator.cpp

LuaState.cpp

LuaStateOutFile.cpp

LuaState_DumpObject.cpp

LuaTableIterator.cpp

lwstrlib.c

 

 

3.       建立目

然后你就可以?/span>VS中徏立一个新目,静态链接库?/span>:

分别把需要的文g加进?/span>,之后~译,应该能通过?/span>.

 

如何使用

接着讲讲如何在你的其他项目中使用LuaPlus.

1.必要的配|?/span>

你的目可能是这L:

GameClient的依赖项?/span>LuaPlusLib

#include "LuaPlus.h"

using namespace LuaPlus;

记得q这?/span>

 

2.创徏一个状?/span>

LuaStateOwner state;

今后的操作都围绕q个state

 

3.执行脚本

int iret = state->DoFile("test.lua");

q回gؓ0表示成功,否则不成?/span>.

 

4.C++中获?/span>Lua脚本的变?/span>

假设你的test.lua中有:

health = 200;

通过下列Ҏ(gu)可以在C++中得到这个数?/span>

int mytest = state->GetGlobal("health").GetInteger();

 

5.C++中调?/span>Lua脚本里的函数

假设你的test.lua中有:

function Add(x, y)

       return x+y;

end

?/span>C++中需要先声明q个函数:

LuaFunction<float> Add =  state->GetGlobal("Add");

q样你就有了Add()q个函数,然后可以像q_一样用它?/span>:

float myret = Add(3.14f,5.25f);

 

6.Lua脚本中调?/span>C++函数

在读?/span>test.lua之前要先?/span>C++函数注册?/span>Lua的运行时栈里,q样在执?/span>lua脚本的时?/span>,才知道执行哪一个函?/span>:

首先有函?/span>:

int LS_PrintNumber(LuaState* state)

{

LuaStack args(state);

 

       if (args[1].IsNumber()) {

              printf("%f\n", args[1].GetNumber());

       }

       return 0;

}

然后注册q个函数?/span>Lua:

state->GetGlobals().Register("PrintNumber", LS_PrintNumber);

q样把LS_PrintNumber映射?/span>Lua中可以用的函数PrintNumber.

Test.lua脚本中添加调用语?/span>:

PrintNumber(30);

?/span>state->DoFile("test.lua");执行的时?/span>,执行了C++中的q个函数.

 

ȝ

本文介绍?/span>LuaPlus的基本配|方法和使用,希望对你有帮?/span>.下一将介绍一些高U特?/span>,如怎样?/span>VS中调?/span>LuaPlus的脚?/span>,以及对类的操作等.

如果q有M疑问可以看看下面q个单的例子:
 /Files/singohgod/LuaPlus_Test.rar

 



]]>
ƷþӰԺ| ޹Ʒ18þþþþ| þ91ᆱƷ2020| þùƷһ| ˾þþƷһ| պþþþþ| Ʒһþ| ޹պŷۺϾþ| 99þѹƷ| ŷձþþƷ| þ99Ʒ99þ6| ޹˾þۺһ77 | AVɫۺϾþAVɫۺ| 鶹ƷþþƷɫۺ| һAëƬѹۿþþƷ| 99þþƷһ| þƵ1| Ʒŷһþþ| þþƷavˮ| ޹պŷۺϾþ| ŷ þ| ó˾þAvѸ| ھƷþþþӰԺ˾| þˬˬƬAV鶹 | þ99žŹѿС˵| 󽶾þĻ| þùƷ99þþþþ| þþƷϵ| þþƷа| þ޹˾Ʒ| 99þ99ֻѵľƷ| ޾ƷƬþ| ŷһþþ| ޾ƷŮþþþ99С˵| Ʒ۲ӰԺþ| ձþ| ߳þѹۿ| 91Ʒþþþþ| 91þþƷ91þɫ| avþþþþòվ| Ʒ18þþþþvr|