积木

No sub title

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

转载:http://blog.csdn.net/bill_man/article/details/7250922

切换高清

随着硬件技术的提高,提供了更好的画面,我们可以通过如下的方法来切换高清

CCDirector::sharedDirector()->enableRetinaDisplay(true);

参数是true,就是开启高清,为false就是关闭高清,当然目前应该是iphone4itouch4及以上支持这种“视网膜”显示。当你开启这个时,你的游戏图片会自动变为“原图片名(除后缀名+"-hd."+后缀名),如果文件不存在会继续使用原图。

posted @ 2013-03-05 13:50 Jacc.Kim 阅读(533) | 评论 (0)编辑 收藏

转载自:http://developer.51cto.com/art/201002/182799.htm

 

C++左值与右值之间共同与不同点解析

2010-02-03 17:32 佚名 博客园 我要评论(1) 字号:T | T
一键收藏,随时查看,分享好友!

C++左值与右值都有哪些不同之处,又有哪些联系呢?我们将会通过对这篇文章的介绍,为大家详细讲解有关内容,帮助大家理解。

AD: 2013大数据全球技术峰会低价抢票中

C++编程语言与C语言相比有很多不同之处,而且这些不同的地方有都体现着非常重要的作用。现在我们将会为大家详细介绍一下有关C++左值与右值之间的一些联系,希望能帮助大家对这一语言有一个深刻的认识。

 

1. C++左值与右值概念

变量和文字常量都有存储区,并且有相关的类型,区别在于变量是可寻址的;

对于每个变量,都有2个值与其相关联:

1>数据值,存储在某个内存地址中,也称右值(rvalue),右值是被读取的值(read value),文字常量和变量都可被用于右值。

2>地址值,即存储数据值的那块内存地址,也称左值(lvalue),文字常量不能被用作左值。

2 . C++左值与右值的相关问题

给表达式加上括号: ++a--

结果 ++(a--)

这个表达式是非法的,因为前增量操作要求一个可修改的左值,而 "a--" 不是左值(即右值)

3 . C++左值与右值中前增量和后增量的区别

早期的c语言教材,for循环语句通常写成:

for(int i=0;i<10;i++)

而现在多为:

for(int i=0;i<10;++i)

两者有区别吗?

a++ 即是返回 a的值,然后变量 a 加 1,返回需要产生一个临时变量类似于

  1. {
  2. int temp = a;
  3. aa=a+1;
  4. return temp; //返回右值
  5. }

 

++a 则为:

  1. {
  2. aa=a+1;
  3. return &a; //返回左值
  4. }

 

显然,前增量不需要中间变量,效率更高。

C++左值与右值的含义与误区

术语 “L-Values” 和 “R-Values” 是很容易被搞混的,因为它们的历史渊源也是混淆。他们最初起源是编译器的设计者,从字面上来理解就是表达式左边的值和表达式右边的值。它们的含义一直在演化而名字却没变,现在已经“名”不副“实”了。虽然还是称为left-value 和right-value,但是他们的含义已经大大不同了。

C++ 03 标准上是这样写的: “每一个表达式要么是一个 lvalue,要么就是一个 rvalue。”

记住,lvalue和rvalue是针对表达式而言的。

lvalue 是指那些单一表达式结束之后依然存在的持久对象。例如: obj,*ptr, prt[index], ++x 都是 lvalue。

rvalue 是指那些表达式结束时(在分号处)就不复存在了的临时对象。例如:1729 , x + y , std::string("meow") , 和 x++ 都是 rvalue。

++x 和 x++ 的区别的语义上的区别: 当写 int i = 10 ; 时, i 是一个 lvalue,它实际代表一个内存里的地址,是持久的。 表达式 ++x 也是一个 lvalue,它修改了 x 的值,但还是代表原来那个持久对象。但是,表达式 i++ 却是一个 rvalue,它只是拷贝一份i的初值,再修改i的值,最后返回那份临时的拷贝,那份拷贝是临时对象。 ++i 和 i++ 都递增i,但 ++i 返回i本身,而 i++ 返回临时拷贝。这就是为什么 ++i 之所以是一个 lvalue,而 i++ 是一个 rvalue。

lvalue 与 rvalue 之分不在于表达式做了什么,而在于表达式代表了什么(持久对象或临时产物)。 判断一个表达式是不是 lvalue 的直接方法就是“能不能对表达式取址?”,如果能够,那就是一个 lvalue;如果不能,那就是一个 rvalue。

以上就是我们为大家介绍的有关C++左值与右值的相关介绍。

【责任编辑:曹凯 TEL:(010)68476606】
posted @ 2013-03-04 23:12 Jacc.Kim 阅读(300) | 评论 (0)编辑 收藏

首先,先温故一下c/c++调用lua的步骤:
1) 下载lua源码包(提示:下载后,需要自行编译,编译后才会有相应的lib)
2) 将编译好的lib链入项目
3) 包含相应的lua头文件,如下:
#ifdef __cplusplus
extern "C" {
#endif
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#ifdef __cplusplus
}
#endif
此处头跟尾处的__cplusplus宏判断是有必要的。
4) 创建一个lua解析器:lua_State *L; L = lua_open();
5) 调用lua库接口:luaL_openlibs(L);打开lua库
6) 至此,就可以使用lua相关的功能了。如:加载lua脚本(luaL_dofileL, luaFileName);等等
7) 在使用完lua后,一定要关掉lua解析器。luaL_close(L);

接下来要介绍的是相反的调用工作。即:通过lua调用c/c++相关的功能。在此就需要用到tolua++了。
在此同样先介绍一下实现步骤:
1) 同样需要先下载tolua++库
2) 将相关的tolua++库链入项目
3) 将需要导给lua脚本使用的c/c++常量、变量、宏、接口、甚至类以及其接口,整理到相应的干净包中。
4) 使用tolua++工具(即:.exe文件),解析干净包。解析成功后,将自动生成相应的c/c++的头文件及源码
5) 包含同 4) 生成的头文件,同时包含tolua++要关的头文件
6) 明确初始化包。具体为:tolua_XXXX_open(L);
7) 此后就可以在lua脚本中使用c/c++相关的功能了。
至此c/c++与lua间的相互调用就全部介绍完毕。

另外,以个人实际游戏框架设计的经验来看,其实,我们可以定义一个协议接口,将项目与lua的接口连接起来。这样,我们在c/c++与lua间的调用就可以通过通用的一个或很少的几个接口来工作。如此整个框架就搭建起来了。
posted @ 2013-02-22 09:56 Jacc.Kim 阅读(933) | 评论 (0)编辑 收藏

今日编译链接一个exe时,提示如下错误:
vs2008 Project : error PRJ0019: A tool returned an error code: "Performing Post-Build Event..."

经过网上查询,可使用如下方法解决:

打开properties属性页,找到Build Events选项,选择Post-build event选项,

它的command line选项置成空

/////////

工程中command line

内容为

mkdir ..\..\..\..\发布组件\服务器组件\Release

copy /y ..\..\..\..\运行\Release\$(TargetFileName) ..\..\..\..\发布组件\服务器组件\Release\$(TargetFileName)



作用 是生成完了拷贝文件用的。
posted @ 2013-01-31 11:54 Jacc.Kim 阅读(1246) | 评论 (0)编辑 收藏

此篇文章打算介绍两个,在平时工作中,使用频繁并且十分有价值的功能。(因为你的项目不用到还好,只要用到,下面这两个一般是必不可少)
功能点1:将本地时间转成格林威治时间,或者是将格林威治时间转成本地时间。
功能点2:将时间转成时间戳,以及如何将时间戳转成时间。
有些人可看刚看到上面的功能点概述,可能会觉得这没什么难的。也的确,事实上,确实不难。但如果你要是没真正处理过的话,可能一时还真会壁。比如:功能点1,将本地时间转成格林威治时间。因为我们根本不知道我们当前的本地时间与标准时间的时差到底是多少。所以你要怎么转??(我们不能单纯地认为,我们是中国人,所以时差都是8个小时。那如果你的游戏要是发布到世界其他国家了??那时差就完全不同。甚至就算是中国,你在上海,跟在西藏,那时间也是有差别的。因此,我们需要根据本地时刻值,精确地计算出与标准时间的时差。从而才可以准确转换成格林威治时间。看下面处理方法:
a) 将格林威治时间转成标准时间
 ptime CommonHelper::utcToLocal(ptime utctime)
 {
  return boost::date_time::c_local_adjustor<ptime>::utc_to_local(utctime);
  //说明:c_local_adjustor对象的utc_to_local()接口就是用来处理本地时间跟标准时间的偏差的。
  //此处所谓的本地时间,并不是固定指说北京时间。而是你的计算处在地球的哪条经线上,该经线
  //跟格林威治所处的经线的时差量。(我刚看到这个功能时,实在太让我惊讶了都!)

  //但是有一点需要注意:boost中,只提供了标准时间转本地时间的上述接口,却没有
  //直接提供将本地时间转成标准时间的接口。不过,既然有了utc_to_loca()这样的神兵利器
  //我们同样可以很方便地处理将本地时间转成标准时间的问题。见如何:
 }

b) 将本地时间转成格林威治时间
ptime CommonHelper::localToUtc(ptime ltime)
 {
  return ltime - (utcToLocal(epoch) - epoch);
  //说明:(utcToLocal(epoch) - epoch)这部分内容您的计算机的当地时差量(如果是在北京,那就是8小时)
 }

接下来介绍一下第二部分的功能点。即:功能点2:将时间转时间戳以及将时间戳转时间
c) 将boost中的时间转成时间戳,其实很简单。中需要做如下处理即可。(在此就不多说)
 WE::int64 CommonHelper::getUTCTimestamp()
 {  
  return (microsec_clock::universal_time() - epoch).total_milliseconds();
 }

d) 此处重点介绍一下,如何将时间戳转成时间。这个确实有点令人头痛。为什么这么说?因为时间戳,其实只是一个
数量值。这个数量值记载的信息的意义是指:自:1970-1-1到指定时刻所走过的时间量值。如此,或许有人就会说,
既然你都说了,是从1970到指定时刻的量值,两个时间相加不就好了。确实是这样子的,但有个小问题是:因为我们
没法清楚这个量值的单位是什么。如果单位是:毫秒,而你把它当成秒或当成微秒来处理,结果都将是错的。关于这点,
其实boost有个时间处理的决策“的开关”,这个似乎还要看自己编译的boost的lib是使用到哪个精度的级别。关于这块
本人暂时还没深入到这方面,所以也不敢妄言。不过,有个接口,大家可以参考着使用下。time_duration::resolution()
这个就可以用来识别,当前系统中boost在时间这方面使用到的精度值。(例如本人目前项目中,使用到的是微秒级别的。
所以返回值为:micro。)
下面给他几种实现时间戳转时间的小例子:(以下假定,时间戳的单位为毫秒)
e) 通过接口:from_time_t();
ptime time_5 = from_time_t(timestamp);
f) 通过time_duration
milliseconds xx(time_1_stamp);
ptime xxxxxxxxxxxx = CommonHelper::epoch + xx;
g) 直接通过手动计算。此方法实现思路很简单,但操作起来个人感觉易错。写的代码量又多,所以本人还是建议使用上面两种,特别是第2种
假如:timestamp是时间戳。则先计算出它的小时,再计算出它的分钟,计算出它的秒数,最后计算出它的毫秒数。然后与commonhelper::epoch相加即可。
注意:上面的e) f) g) 其实还是有区别的。用e)跟f)转出来的精度值方面会不中方法g)。但在项目使用中,前两者计算出来的精度值,一般
情况下,是绝对可够的。这是一个注意点,给大家提醒一下。

好了,这篇文章暂时就先写到这吧。。其实关于boost时间,还有非常多的内容可以挖掘,改天有机会再写吧。希望对大伙有帮助。
如果有错误之处,还请指教。:)
posted @ 2013-01-02 16:27 Jacc.Kim 阅读(2932) | 评论 (0)编辑 收藏

正常情况下,Lua对函数的调用与c/c++是一样的。
即:调用函数时,必须加上括号。如:

声明:
function testFunc(x, y)
   // do something...
end;

调用:
testFunc(3, 4);

但是有一个特殊是:如果函数的参数只有一个。并且这个参数是字符串或者是表结构时,括号可以不写。如下:
print "Hello world!";         它等价于: print("Hello world!");
dofile "a.lua";                  它等价于: dofile("a.lua");
yourfunction {x = 10, y = 20};   它等价于: yourfunction({x = 10, y = 20});
type {}                           它等价于: type({});
posted @ 2012-12-08 14:42 Jacc.Kim 阅读(214) | 评论 (0)编辑 收藏

 1 
 2 -- 学习一下表结构的语法
 3 function studyTableStruct()
 4 
 5     local testTable = {};   --初始化一个空的(即:该表中没有任何域)
 6     testTable[2= "是吧";
 7     print(testTable[2]);    --此处正常输出。说明就算是添加新字段,字段的索引也未必就一定要按顺序从1开始。
 8     testTable[1= "ak47";  --添加一个无名字的新字段,而且它的索引值是为1的。([a]记住:只要字段有索引的概念,则它就没有名字) 。这边的 [a]与下面的 [b] 说明很关键
 9     print(testTable[1]);
10     testTable.newField = "newfield";--添加一个名字为newField的新字段。([b]记住:只要字段有名字,则它就没有索引这一概念。)
11     print(testTable.newField);
12     testTable["x"= "哇塞,这也行?";
13     print(testTable["x"]);
14     
15     -- 如果理解了上面的 [a] 与 [b] ,则很容易理解下面的例子
16     local a = {x = 20, y = 0};--这个例子是来自教材上的例子。但是在此本人有做了修改。并亲自测试过后,总结了上面的 [a] 与 [b] 点
17     print(a.x);         --输出:20
18     print(a[1]);        --输出:nil
19     print(a["x"]);      --输出:20
20     --如果将a的结构改成如下:
21     a = nil;
22     a = {x = 20"agogo", y = 0"ak47""mytest"};
23     print(a.x);         --输出:20
24     print(a[1]);        --输出:agogo
25     print(a[2]);        --输出:ak47
26     print(a[3]);        --输出:mytest
27     print(a["x"]);      --输出:20
28     --pritn(a[x]);        --这样会蹦。要么像 a[1]那样访问。即:中括号呈的内容必须为数字或者使用双引号括号起来
29     --[[
30     总结一下上面的测试例子:
31     1) 大括号:{} 是用来定义一个表结构的。所谓的定义,其实只不过是给表一个初始化的作用。其实里面的字段域有几个或怎么初始化,都只是影响到初始化时的状态。
32         后面不要时,完全可以随时将某个字段删除掉(提示:删除只需要将该字段赋nil即可。)
33         也完全可以随时随地添加一个新的字段。
34         正因为如此灵活,所以说 {} 仅仅只是影响表的初始化的结构状态。
35     2) 表的字段域的访问有两种:YourTable.FieldName以及使用中括号 [] 来访问。
36         a) 如果所访问的字段不存在。则返回nil
37         b) 使用YourTable.FieldName访问字段时,则如果表中不存在FieldName这个字段时,返回nil。存在时,返回相应的值。像上面的a表中的x与y就可以用这种方式访问。
38             或者上面的testTable表中的newField或者 x字段就可以这样子访问
39         c) 使用中括号 [] 访问时,如果表中的字段是有名称的话,则字段必须使用双引号括号起来。否则访问不到。并且还会蹦。
40         d) [] 中的内容,只能是数值索引,或者是使用双引号括号起来的字段的名称。
41     ]]--
42     
43 end
44 
45 
posted @ 2012-12-08 14:18 Jacc.Kim 阅读(334) | 评论 (0)编辑 收藏

简述:在 Delphi 中,有 and 与 or
在 c/c++ 中,有 && 与 ||
在 Lua 中,有 and 与 or
它们3者都表示逻辑运算符。但它们是有区别的。
Delphi中的 and 与 or 不但可以表示逻辑与、逻辑或运算符,还可以表示与运算以及或运算。
示例:
procedure test;
var
   lVar: integer;
   lVar2: integer;
   lVar3: integer;
begin
   lVar = 20;
   lVar2 = 30;
   if (10 = lVar) and (20 = lVar2) then
   begin
      // do something here.
   end
   else if (20 = lVar) or (30 = lVar2) then
   begin
      // do something here.
   end;
   lVar3 = lVar and lVar2;//这个就是相当于c/c++中的 &
   lVar3 = lVar or lVar2;//这个就相当于c/c++中的 |
end;

关于 c/c++ 中的 &&、||、&、| 在此,我想就不用多说了吧。
接下来说说,Lua中的 and 与 or
在 Lua 中,and 也是逻辑运算符,但它的取值很特别:
a and b;它的返回值并不是我们所想象的 true 或者 false.而是:如果 a 为假(即:为 false 或者 nil 时),则表达式返回 a。否则就返回 b
同样 a or b;它返回的也不是true与false。而是:当 a 为真时,则返回 a 否则返回 b.
posted @ 2012-12-08 13:29 Jacc.Kim 阅读(925) | 评论 (0)编辑 收藏

1) Lua字符串可以使用双引号括起来。
2) Lua字符串同样可以使用单引号括起来。
3) Lua字符串还可以使用 [[...]] 括起来。(提示:中间的 ... 就是字符串的内容。
关于这种形式来表达字符串的,有以下说明点:
      a) [[ 这是字符串起始标志。(就如同:" 一样)]] 当然就是结束标志了。
      b) ... 的内容中,就算有转义字符,则转义字符的转义功能失效。它会被按原样输出。
      c) ... 中的任何空格都将被保留,按原样输出。(包括行头的空格)
因此:
      local str = [[这只是一个测试。\r\n是不是北京??
            吃东西吧。(注意:吃东西吧。前面是有空格的)
            ]];
      print(str);
在屏幕上打印出来的结果应该如下:
这只是一个测试。\r\n是不是北京??
            吃东西吧。(注意:吃东西吧。前面是有空格的)

4) .. 可以用来连接两个字符串。同样也可以用来连接两个数值或者数值与字符串,使它们最终成为一个字符串。
注意:如果连接的前后有数值时,最好在 .. 的前与后都加一个空格。
示例:
      a) local str1 = "Hello, " .. "world!"; // 这时的..的前后可以加或不加空格都正确
      b) local str2 = "Hello, " .. 20;//这时,..的后面最好加上空格
      c) local str3 = 20 .. "world!";//这时,..的前面必须要加上空格。否则会出错
      d) local str3 = 20 .. 30;//这时,..的前面与后面都必须加上空格。否则会出错。

5) string.gsub()是用来替换某字符串中的子串的。示例如下:
      local strOld = "Hello, world!";
      local strNew = string.gsub(strOld, "Hello,", "Hello ");
      print(strOld);      // 输出: Hello, world!
      print(strNew);      //输出: Hello world!
posted @ 2012-12-08 13:12 Jacc.Kim 阅读(496) | 评论 (0)编辑 收藏

 

 1 
 2 #include "stdafx.h"
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 extern "C"{
 8 #include "lua.h"
 9 #include "lualib.h"
10 #include "lauxlib.h"
11 }
12 
13 lua_State *L;
14 
15 int _tmain(int argc, _TCHAR* argv[])
16 {
17     //* 创建一个指向Lua解释器的指针。
18     L = lua_open();
19     //* 函数加载Lua库
20     luaL_openlibs(L);
21     //* 加载Lua脚本
22     luaL_dofile(L, "../TestException/add.lua");
23 
24         int x = 3, y = 8;
25         //函数名
26         lua_getglobal(L, "add");
27         //第一个参数压栈
28         lua_pushnumber(L, x);
29         //第二个参数压栈
30         lua_pushnumber(L, y);
31         //调用函数
32         lua_call(L, 21);
33         //得到返回值
34         int sum = (int)lua_tonumber(L, -1);
35         lua_pop(L, 1);
36         cout << sum << endl;
37 
38     //* 关闭释放资源
39     lua_close(L);
40 
41     waitplease;
42     return 0;
43 }
44 
45 

 

posted @ 2012-12-08 12:49 Jacc.Kim 阅读(364) | 评论 (0)编辑 收藏

仅列出标题
共14页: First 2 3 4 5 6 7 8 9 10 Last