猴子的故事

很久以前有两只猴,在摘桃的时候为了不被老虎吃掉,决定合作。有一只先上树吃桃,另外一只负责放哨。吃桃的要留一半给放哨的,而放哨的不能擅离岗位。这就要求两只猴子不能只想自己。于是,两只猴变成了猴群,猴群变成了人群。——《无人区》

本来是带着看喜剧的心情去看《无》,结果悲剧了,看成了悲情剧,也引发了对人性的思考,我咧了个去,太疼了。故事么,就是这么一个故事:

成功律师潘肖(徐峥 饰)刚刚出色地赢得了一场艰难的诉讼,离开城市初涉戈壁滩,驾车飞驰在西部公路上。一个神秘人挡在前方,一起车祸就这样发生……方圆六百里无人区,一切通信方式形同虚设。 数百公里外的城市里,一个能助他登上成功巅峰的机会在诱惑他;荒漠中央唯一的加油站里,一位善良的女孩在等待他;六百里之内唯一的公路上,两股凶神恶煞在追击他;潘肖跑在一条仿佛没有尽头的公路上,似乎已走投无路…… 这是一个“成功人士”走进无人区,在绝境之中力挽狂澜的故事……(摘自豆瓣

为数不多的国产优质剧情片,网友还有认为是离好莱坞最近的一次,我觉得过了吧,呵呵。

看完的第一反应是:不应该带着看喜剧的心情去看,失望了,不是因为电影不好,而是本想乐一乐的,结果剧情是犯罪,色调是大西北,灰灰的;第二反应是:这片子有什么问题?为什么被禁?被剪了哪段?看着还挺连贯的。后来在网上搜了一下这部片子为什么被禁,最后比较合理的解释应该是没有被禁,只是延期,相隔4年上映,大家自然以为是被禁了,其实事情没有想象的那么简单。延期的原因,和政治风头有关,与少数民族有关,与西北稳定有关,不多说了,总之上映了,算是无心做了一回电影期货,以4年前的电影成本,在今年抛售,票房收入绝对不菲!

说说这部片子带给我的思考。一名只为名利的律师,为奸人辩护,只为钱财,但他内心还是善良的,只是他太渴望成了,一直梦想着能“上头条”,进入无人区后,他以为自己撞死了人,自己又喝酒,想着自己一辈子就完了,他很害怕,害怕失去,对自己的人生绝望了,不论什么原因撞了人,酒后事故致人死亡,坐牢是一定的(PS:提醒一下自己,酒后驾车,害人害己!)。

 

Read More →

什么是扁平化?

“扁平化”这个词听过好几遍,一直没有深究是什么意思,好像知道,但是又不太清楚,字面意思是把界面设计成又扁又平的样子,而事实上,还真就的是这么一回事。看起来没什么技术含量,但事实并非如此,连苹果这么高傲的公司,在IOS7开始,也广泛使用扁平化设计,这就代表扁平化设计是当前设计的潮流,是能被广大用户所接受的设计方式。

在搜索“什么是扁平化设计?”时,会看到好多文章把它与拟物化设计扯在一起,知乎达人负二的回答,我更赞同:与“扁平化设计”相对应的是“浮雕效果”。

“扁平化设计”根本是种古老的UI,和“拟物化设计”、学习成本什么的根本扯不上关系好吗?BIOS设置界面就是典型的“扁平化设计”,这种表单的形式很美吗?我觉得很丑诶!但是它很难学吗?我觉得很清楚明了嘛!

“扁平化设计”之所以可以取代浮雕效果,成为一种趋势,基本就是触摸操控兴起和鼠标没落的结果——在用不到鼠标,而用手指的情况下,浮雕效果的必要性大大减弱了(因为手指面积很大,相应地按钮、图标等可点击元素的面积也会相应增大,并由于手指和界面的直接接触,相对于展现”按下/弹起“这个状态,展现出手指触摸到的面积更重要一点),它变成了一种偏重装饰性的多余的设计。

拿苹果的“拟物化设计”和“扁平化设计”来做对比分析真是牵强到死!“拟物化设计”的逻辑出发点是”学习成本“,“扁平化设计”的逻辑出发点是”为触摸优化“,把这二者硬扯到一起,各位不觉得有点关公战秦琼的意思吗?我不觉得“拟物化设计”和“扁平化设计”是矛盾的,一个闹钟图标,你可以做成立体的,也可以做成平面的,但不会因为你把它做成平面的,人们就认不出它是一个闹钟了!

又想起腾讯的产品,微信和QQ,每天都离不开,微信做得好看吗?我觉得大多数人都不会觉得好看吧?但是为什么还要用?只是我们离不开他罢了。下一个版本的微信和QQ,也许就是扁平化的,触控设备使用扁平化设计,正符合用户的口味,下面的这个广告,就说明了一切。

Read More →

C语言中的main函数参数及返回值

开发中遇到了需要传参数给main函数的问题,不常用,也就不记得了,特意查了一下,参考这里

一个简单的C语言例子,如下(例子来源于参考网站):

int main(int argc, char *argv[])
{
   int i;
   for (i = 1; i < argc; i++)
       printf("%s%s", argv[i], (i < argc-1) ? " " : "");
   printf("\n");
   return 0;
}

程序编译后,添加参加如:c:\demo.exe hello,world

程序就会运行出来结果:

hello,world

C语言约定:argv[0]的值是启动该程序的程序名,因此argc的值至少为1,如果argc的值是1,说明程序名后面没有命令行参数。

Read More →

BAT脚本获取批处理文件所在路径

参考:http://www.cnblogs.com/lm002003/archive/2012/05/15/2502365.html

BAT命令经常使用,有必要记住几个常命令,命令大全参考:http://blog.csdn.net/annhf/article/details/1842362

这里是MARK一个获取路径的小知识,开发时遇到一个小问题,获取可执行文件的当前路径,这样文件不论转移到哪儿,都可以运行,“write once, run anywhere!”的精髓啊。

在批处理开头加入cd /d %~dp0就可实现当前目录切换,%0是批处理文件本身的路径,%~dp进行扩展, d向前扩展到驱动器,p往后扩展到路径。例如,你的bat文件在e:/mybat/test.bat,则%0就是e:/mybat/test.bat, %~dp0是e:/mybat/,例子来源参考网站。

更多有用的命令:

  • %~0: 取文件名(名+扩展名) 
  • %~f0:取全路径 
  • %~d0:取驱动器名 
  • %~p0:只取路径(不包驱动器) 
  • %~n0:只取文件名 
  • %~x0:只取文件扩展名 
  • %~s0:取缩写全路径名 
  • %~a0:取文件属性 
  • %~t0:取文件创建时间 
  • %~z0:取文件大小 

Read More →

关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突

参考:http://www.cnblogs.com/lin1270/archive/2013/04/17/3025831.html

多线程调试直接崩溃,没有堆栈调用,很难查问题,只有一个错误提示框,类似于“关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突”,参考上述站点,把堆栈调出来的方法,MARK:

工具栏上的【调试】->【异常】,把图上显示的【引发】勾上即可。

Read More →

数组名和数组名取地址的区别

一直困惑了很久的一个问题,今天终于解决了,参考:http://blog.csdn.net/daniel_ice/article/details/6857019

#include <stdio.h>

int a[2] = {1,2};
int main(){
        printf("a = %p\n", a); // I
        printf("&a = %p\n", &a); // II
        printf("a + 1 = %p\n", a + 1);// III
        printf("&a + 1 = %p\n", &a + 1);// IV

        return 0;
}
//结果如下(Windows):
//a = 01137034
//&a = 01137034
//a + 1 = 01137038
//&a + 1 = 0113703C

在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。

看到这里我想应该就知道为什么 会有I 和 III式的结果了。

对于II 和 IV 则是特殊情况,在《C和指针》p142中说到,在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。

所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。

Read More →

字符串常量到底存放在哪个存储区

参见搜索做的总结,原文地址如下:http://blog.csdn.net/daiyutage/article/details/8605580

一直有一个疑惑,字符串常量放在哪个存储区呢?比如:

char *pstr = "hello world!";

这里,"hello world!"是一个字符串常量,pstr是在栈中的变量,字符串常量(hello world!),如何存储?举个例子,比较清晰。

//main.cpp
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
    int b; //栈
    char s[] = "abc"; //栈
    char *p2; //栈
    char *p3 = "123456"; //123456\0在常量区,p3在栈上。
    static int c = 0; //全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    //分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

上面例子说得比较全了,之前还以为char s[] = "abc"; 这里的abc也是在常量区,too young, too simple啊。

下面总结的一些常识,很形象,很生动,MARK一下。

Read More →

逗号表达式

逗号表达式,不常用,安全软件编码中也不允许使用,百科的解释比较到位:

c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14。(a=3*5,a*4)的值是60。

看两个例子就能明白,这两个例子都是告诉我们,逗号运算符的优化级比赋值号还低。

main()
{
    int a, b, c, d;        
    a = 3;
    b = 5;
    c = a, b;
    d = (a, b);
    printf(" c = % d & quot; , c);
    printf(" d = % d & quot; , d);
}
//结果是 3 5

 

main()
{
    int x, y, z;
    x = y = 1;
    z = x++, y++, ++y;
    printf("%d,%d,%d\n", x, y, z);
}
//结果是 2 3 1 

Read More →

指针和数组要深入理解

一直忙于干活,很多知识都遗忘了,遇到一段代码,发现自己的基础太令人捉急了,代码类似于:

main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int *ptr = (int *)(&a + 1);
    printf("%d %d" , *(a + 1), *(ptr - 1));
}

结果应该是2 5,原因在于(int*)(&a+1)这里。


2013/12/10 22:51 update:

指针和数据很多时候混用,但不代表两者相同,另外,很重要的一点,如果一个数组声明为指针时,定为成数组时,如下:

extern int *a;//声明

int a[0] = {0,1};//定义

在使用extern的文件中,若使用a[0]的方式来访问,就会出现错误,原因是编译以声明作为编译的依据,定义可以看作是一种特殊的声明,是分配内存,甚至初始化的功能。用指针去访问数组,存在二次寻址的过程,但是例子中的指针a并不存在一个额外的内存地址用来存放指针变量,所以编译器会把a[0]翻译为,先从a的内容中取内容0,再去寻找存放在地址0内的内容,这显然是不正确的,找不到地址为0的内存。

Read More →

vs2008【断点无效】解决方法

遇到问题,一搜就能搜到,常见问题,MARK,参考:http://www.cnblogs.com/fangyukuan/archive/2010/12/20/1911730.html

在debug下,检查工程配置是否设置正确。 

  1. C++>General->Debug Information Format->Program Database (/Zi)
  2. C++>Optimization->Optimization->Disabled (/Od)
  3. Linker->Debugging->Generate Debug Info->Yes (/DEBUG)
  4. Linker->Debugging->Generate Program Database File->$(TargetDir)$(TargetName).pdb

如果工程配置没问题,请打开:

Tools->Option->debugging->General 找到 Require source files to exactly match the original version 不要打勾

即:工具->选项->调试里->常规 找到 要求原文件与原始版本完全匹配 不要打勾

Read More →
微信扫码联系
微信扫码联系