当前位置:  编程技术>综合
本页文章导读:
    ▪eLua学习第三课:Lua脚本语言的基础入门教程       eLua学习第三课: ---Lua脚本语言基础入门教程 (作者:LL   出处:http://blog.csdn.net/tcpipstack , 欢迎转载,也请保留这段声明。谢谢!) 经过第二课 eLua学习第二课:在Ubuntu OS下的Lua.........
    ▪subversion 1.7.8 linux下的安装笔记        因为eclipse换成了4.2.1,里面自带的svn就更新到了1.8.0,在命令终端中用1.6版本的svn就不能使用了,就只能去安装1.7+的svn。   安装subversion-1.7.8 需要依赖以下包: SQLite-3.7.15.1, Apr-Util-1.5.1 and neon.........
    ▪跟我一起玩Win32开发(2):完整的开发流程      上一篇中我给各位说了一般人认为C++中较为难的东西——指针。其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类、虚基类、纯虚函数等,这些都.........

[1]eLua学习第三课:Lua脚本语言的基础入门教程
    来源: 互联网  发布时间: 2013-11-10

eLua学习第三课: ---Lua脚本语言基础入门教程


(作者:LL   出处:http://blog.csdn.net/tcpipstack , 欢迎转载,也请保留这段声明。谢谢!)


经过第二课 eLua学习第二课:在Ubuntu OS下的Lua源码安装方法 的学习,我们已经将Lua的开发环境安装好了,那么在这一课中我们将学习Lua的基本知识。


写在前面的话

编程语言之于程序员,若武功招式之于习武之人,招式虽重要,但在于使用之人。胜者之道,武功只行于表,高手用剑,片草只叶亦威力无穷。
当今武林,派别林立,语言繁杂,林林总总不计其数。主流文化的C/C++、Java、C#、VB;偏安一隅的Fortran;动态语言中的Perl、Tcl、Ruby、Forth、Python,以及本书介绍的Lua;..,等等等等。

虽说语言的威力依使用者本身的修为高低而定,但不同语言本身的设计又有不同。若让用Java写写操作系统内核、Perl写写驱动程序、C/C++写写web应用,都无异于舍近求远,好刀只用上了刀背。


Lua本身是以简单优雅为本,着眼于处理那些C不擅长的任务。借助C/C++为其扩展,Lua可闪现无穷魅力。Lua本身完全遵循ANSI C而写成,只要有C编译器的地方,Lua便可发挥她的力量。Lua不需要追求Python那样的大而全的库,太多的累赘,反而会破坏她的优美。

(以上内容摘自《Lua中文教程》)


从Hello World开始

hello world作为所有编程语言的起始阶段,所有的编程第一步就在于此了!

我们先使用Lua语言来实现这一步:

root@long-desktop:/work/prjs/lua-5.2.1# lua
Lua 5.2.1  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print "Hello World"
Hello World
> io.write("Hello World\n")
Hello World
> 

上面的代码展示了2种实现方法,io.write("Hello World\n") 更符合Lua的style,推荐使用。


Lua的基本语法

在Lua中,一切都是变量,除了关键字。请记住这句话。

1. 标示符

标示符:字母(letter)或者下划线开头的字母、下划线、数字序列.最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。Lua中,letter的含义是依赖于本地环境的。


2. 保留字

保留字:以下字符为Lua的保留字,不能当作标识符。

and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while

3. 注释

写一个程序,总是少不了注释的。
在Lua中,你可以使用单行注释和多行注释。


单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。相当于C++语言中的"//"。
多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。这种注释相当于C语言中的"/*…*/"。在注释当中,"[["和"]]"是可以嵌套的。

例如:

--[[
print(10) -- no action (comment)
--]]

4. Lua语句

在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。

Lua 有好几种程序控制语句,如:

  •   条件控制:if 条件 then … elseif 条件 then … else … end
  •   While循环:while 条件 do … end
  •   Repeat循环:repeat … until 条件
  •   For循环:for 变量 = 初值,终点值,步进 do … end
  •   For循环:for 变量1,变量2,… ,变量N in表或枚举函数 do … end

  注意一下,for的循环变量总是只作用于for的局部变量,你也可以省略步进值,这时候,for循环会使用1作为步进值。


  你可以用break来中止一个循环。
  如果你有程序设计的基础,比如你学过Basic,C之类的,你会觉得Lua也不难。但Lua有几个地方是明显不同于这些程序设计语言的,所以请特别注意。

  .语句块
    语句块在C++中是用"{"和"}"括起来的,在Lua中,它是用do 和 end 括起来的。比如: 
    do print("Hello") end
    你可以在 函数 中和 语句块 中定局部变量。

  .赋值语句
    赋值语句在Lua被强化了。它可以同时给多个变量赋值。
    例如:
    a,b,c,d=1,2,3,4
    甚至是:
    a,b=b,a -- 多么方便的交换变量功能啊。
    在默认情况下,变量总是认为是全局的。假如你要定义局部变量,则在第一次赋值的时候,需要用local说明。比如:
    local a,b,c = 1,2,3 -- a,b,c都是局部变量

  .数值运算
    和C语言一样,支持 +, -, *, /。但Lua还多了一个"^"。这表示指数乘方运算。比如2^3 结果为8, 2^4结果为16。
    连接两个字符串,可以用".."运处符。如:
    "This a " .. "string." -- 等于 "this a string"

  .比较运算
    < > <= >= == ~=
    分别表示 小于,大于,不大于,不小于,相等,不相等
    所有这些操作符总是返回true或false。
    对于Table,Function和Userdata类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如:
    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

  .逻辑运算
    and, or, not
    其中,and 和 or 与C语言区别特别大。
    在这里,请先记住,在Lua中,只有false和nil才计算为false,其它任何数据都计算为true,0也是true!
    and 和 or的运算结果不是true和false,而是和它的两个操作数相关。
    a and b:如果a为false,则返回a;否则返回b
    a or b:如果 a 为true,则返回a;否则返回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中这是很有用的特性,也是比较令人混洧的特性。
    我们可以模拟C语言中的语句:x = a? b : c,在Lua中,可以写成:x = a and b or c。
    最有用的语句是: x = x or v,它相当于:if not x then x = v end 。

  .运算符优先级,从高到低顺序如下:
    ^
    not - (一元运算)
     * /
     + -
     ..(字符串连接)
     < > <= >= ~= ==
     and
     or

5. Lua变量类型

怎么确定一个变量是什么类型的呢?大家可以用type()函数来检查。Lua支持的类型有以下几种:

  Nil 空值,所有没有使用过的变量,都是nil。nil既是值,又是类型。
  Boolean 布尔值
  Number 数值,在Lua里,数值相当于C语言的double
  String 字符串,如果你愿意的话,字符串是可以包含'\0'字符的
  Table 关系表类型,这个类型功能比较强大,我们在后面慢慢说。
  Function 函数类型,不要怀疑,函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。
  Userdata 嗯,这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的,在这种情况下,Userdata可以是宿主的任意数据类型,常用的有Struct和指针。
  Thread   线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。如果感兴趣的话,可以去看看Lua的文档。


6.  变量的定义  
    
[2]subversion 1.7.8 linux下的安装笔记
    来源:    发布时间: 2013-11-10

 

因为eclipse换成了4.2.1,里面自带的svn就更新到了1.8.0,在命令终端中用1.6版本的svn就不能使用了,就只能去安装1.7+的svn。

 

安装subversion-1.7.8 需要依赖以下包:

SQLite-3.7.15.1, Apr-Util-1.5.1 and neon-0.29.6 或者  serf.

 

对于这些最好不要尝试自己去编译,直接用下面命令即可,各个包又会依赖于其他包,累人!(Apr-Util依赖于Apr,neon依赖于libxml2-2.9.0 或者 expat-2.1.0)

 

sudo aptitude install libneon27

sudo aptitude install libsqlite3-0

sudo aptitude install libapr1

sudo aptitude install libaprutil1-dev

 

 

wget http://mirrors.tuna.tsinghua.edu.cn/apache/subversion/subversion-1.7.8.tar.gz 

tar -zxvf subversion-1.7.8.tar.gz  

./configure --disable-static --without-berkeley-db

make 

sudo make install 

 

 

错误:

make: *** [subversion/libsvn_subr/libsvn_subr-1.la] Error 1

解决:

--with-apr  和 --with-apr-util要指源码包里面,不能指安装好的地方的

 

 

错误:

/usr/local/lib/libz.a: could not read symbols:

 

解决办法:

cd zlib-1.2.3

./configure

 

vi Makefile

找到 CFLAGS=-O3 -DUSE_MMAP  -- > CFLAGS=-O3 -DUSE_MMAP -fPIC 

 

重新编译下zlib即可!



已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—




    
[3]跟我一起玩Win32开发(2):完整的开发流程
    来源: 互联网  发布时间: 2013-11-10

上一篇中我给各位说了一般人认为C++中较为难的东西——指针。其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类、虚基类、纯虚函数等,这些都是概念性的东西,几乎每一本C++书上都会介绍,而平时我们除了会接触到纯虚函数外,其他的不多用。纯虚函数,你可以认为与C#中的抽象方法或接口中的方法类似,即只定义,不实现。好处就是多态,发何处理,由派生类来决定。

在开始吹牛之前,我先推荐一套视频教程,孙鑫老师的C++教程,共20课,我不是帮他老人家打广告,而是因为孙老师讲的课是我听过的最好的课,我都看过4次了,我完全可以用他的视频教程来复习C++的。

 

好了,F话说完了,下面我就扯一下编写一个Win32应用程序的大致流程,不管你的程序有多么复杂,多么变态,其基本思路和流程是不变的。这就好比你写书法的时候,特别是写楷书,我不管你用的是欧体、颜体,还是柳体,你都得遵守“永字八法”基本规则。

那么,我们要编写一个Win32应用程序,要经过哪几个步骤呢?

你不妨想一想,你有一家工厂是生产女性服装的,如果你要生产一批新式服装(例如某种冬装),你会有哪些流程?

首先,如果我们确定要做这么一款服式,我们要请设计师来把服装设计好,然后打版,打版就是生成基本样本,以后工人就按照这个样本做就行了。

其次,注册产品,向上级主管申报,登记后就转入车间或下游加工企业开工。

再次,为了展示你的新产品的特色,你要举办一场服装表演。

接着、持续更新,发现产品存在的问题,不断改进修正。

最后,推向市场。

我们开发Win32应用程序也是遵守这样的规范。不过,我想现在很少人用Win32在实际开发中,毕竟它的开发效率是相当地低下,所以,曾被某些人误认为只适用于开发木马程序。其实,也不一定的,不要太邪恶了。

MFC对Win API函数的封装,后来出现了托管C++,你可以用于写WinForm程序,这样可以提高开发效率。

如果你有足够的时间,如果你还在学习编程,如果你是刚进入大学的年轻有为者,你不用急,因为你会有更多的时间磨炼,你应当考虑多学一点C类语言,C++的学习你会发现你能学到很多其他语言中学不到的知识,特别是接触到不少原理性的东西,能加深你对编程哲学的认知。

 

一、WinMain入口点

我们在学习标准C++的时候,都知道每个应用程序运行时都会先进入入口点函数main,而当从main函数跳出时程序就结束了。在Windows编程里面,也是一样的,只是我们的入口点函数不叫main,叫WinMain,这个函数不同于main,我们不能乱来,它的定义必须与声明保持一致。

我建议各位安装VS的时候,都顺便更新帮助文档到本地硬盘,这样我们可以方便查找。有一点要注意,目前DestTop Develop的文档基本上是英文的,做好心理准备。

WinMain函数怎么写呢,不用记的,到MSDN文档一搜,直接复制就行了。

int CALLBACK WinMain(
    _In_  HINSTANCE hInstance,
    _In_  HINSTANCE hPrevInstance,
    _In_  LPSTR lpCmdLine,
    _In_  int nCmdShow
  );


这个函数带了一个CALLBACK,说明它是一个回调函数,那么这个CALLBACK是啥呢。我们先不管,我们先动写一个Windows,让大家有一个更直观的认识。

1、启动你的开发工具,版本任意。

2、从菜单栏中依次【文件】【新建】【项目】,在新建项目窗口中,选择Win32-Win32应用程序。

 

2、点击确定后,会弹出一个向导,单击【下一步】。项目类型选择Windows应用程序,附加选项选择空项目,我们要自己编写实现代码。

 

3、单击完成,项目创建成功。打开【解决方案资源管理器】,在“源文件”文件夹上右击,从菜单中找到【添加】【新建项】,注意,是源文件,不要搞到头文件去了。

在新建项窗口中选C++代码文件,.cpp后缀的,不要选错了,选成头文件,不然无法编译,因为头文件是不参与编译的。文件名随便。

 

包含Windows.h头文件,这个是最基本的。

#include <Windows.h>


然后是入口点,这个我们直接把MSDN的声明Ctrl + C,然后Ctrl + V上去就行了。

int CALLBACK WinMain(
    _In_  HINSTANCE hInstance,
    _In_  HINSTANCE hPrevInstance,
    _In_  LPSTR lpCmdLine,
    _In_  int nCmdShow
  )
{

	return 0;
}


WinMain返回整型,返回0就行了,其实是进程的退出码,一定要0,不要写其他,因为0表示正常退出,其他值表示非正常退出。

刚才我们提到这个函数带了CALLBACK,那么,它是什么?很简单,你回到IDE,在CALLBACK上右击,选【转到定义】,看看吧。

我们看到它其实是一个宏,原型如下:

#define CALLBACK    __stdcall

这时候我们发现了,它其实就是__stdcall,那么这个__stdcall是什么呢?它是和__cdecl关键字对应的,这些资料,你网上搜一下就有了,如果你觉得不好理解,你不妨这样认为,__stdcall是专门用来调用Win API 的,反正MSDN上也是这样说的,它其实是遵循Pascal的语法调用标准,相对应地,__cdecl是C语言的调用风格,这个也是编译器选项。
打开项目属性,找到节点C/C++\高级,然后查看一下调用约定,我们看到默认是选择C风格调用的,所以,WIN API 函数才用上关键字__stdcall,如果你实在不懂,也没关系,这个东西一般不影响我们写代码,但属性窗口中的编译器选项不要乱改,改掉了可能会导致一些问题。

 

那么CALLBACK有什么特别呢?一句话:函数不是我们调用的,但函数只定义了模型没有具体处理,而代码处理权在被调用者手里。怎么说呢,我们完全把它理解为.NET中的委托,我想这样就好理解了,委托只声明了方法的参数和返回值,并没有具体处理代码。

WinMain是由系统调用的,而WinMain中的代码如何写,那操作系统就不管了。就好像我告诉你明天有聚会,一起去爬山,反正我是通知你了,至于去不去那是你决定了。

接下来看看入口点函数的参数。

注意,我们平时看到很多如HANDLE,HINSTANCE,HBRUSH,WPARAM。LPARAM,HICON,HWND等一大串数据类型,也许我们会说,怎么Windows开发有那么多数据类型。其实你错了,人总是被眼睛所看到的东西欺骗,Win API 中根本没有什么新的数据类型,全都是标准C++中的类型,说白了,这些东西全是数字来的。如果你不信,自己可以研究一下。

它定义这些名字,只是方便使用罢了,比如下面这样:

int hWindow;
int hIcon;
int theAppInstance;

第一个变量指的是窗口的句柄,第二个指的是一个图标的句柄,第三个是当前应用程序的实例句柄,你看看,如果我们所有的句柄都是int,我们就无法判断那些类型是专门用来表示光标资源,不知道哪些类型是专用来表示位图的句柄了,但是,如果我们这样:

#defin HBRUSH  int64

这样就很直观,我一看这名就知道是Brush Handlers,哦,我就明白它是专门用来管理内存中的画刷资源的,看,这就很明了,所以,通常这些新定义的类型或者宏,都是取有意义的名字。比如消息,它也是一个数字,如果我说115代表叫你去滚,但光是一个115谁知道你什么意思,但是,如果我们为它定义一个宏:

#define WM_GET_OUT    115

这样,只要我SendMessage(hwnd,  WM_GET_OUT, NULL, NULL),你就会收到一条消息,滚到一边去。

 

WinMain的第一个参数是当前应用程序的实例句柄,第二个参数是前一个实例,比如我把kill.exe运行了两个实例,进程列表中会有两个kill.exe,这时候第一次运行的实例号假设为0001,就传递第一个参数hInstance,第二次运行的假设实例号为0002,就传给了hPrevInstance参数。

lpCmdLine参数从名字上就猜到了,就是命令行参数,那LPSTR是啥呢,它其实就是一个字符串,你可以跟入定义就知道了,它其实就是char*,指向char的指针,记得我上一篇文章中说的指针有创建数组的功能吗?对,其实这里传入的命令行参数应该是char[ ],这就是我在第一篇文章中要说指针的原因。

这里告诉大家

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3