2007年06月11日

C++几种类型转换操作符的区别

1)dynamic_cast 用于将派生类指针或引用,转换为基类指针或引用

   class Derived : public Base { };

   Base* b;
   Derived* d;

   b = dynamic_cast<Base*>(d);

   对于指针,如果转换失败,b=NULL;
   对于引用,如果转换失败,引发bad_cast异常

2)const_cast 用来去掉变量的const属性

   const int *val;
   int *p;

   p = const_cast<int*>(val);

3)static_cast 非多态转换,不作运行时检查,传统强制转换的替代品

   int i;
   double d;

   d = statkc_cast<double>(i);

4)reinterpret_cast 把一种类型转换成另外一种类型,不兼容类型之间的强制转换(如整数转指针,指针转整数)

   i = reinterpret_cast<int>(ptr);

 

2007年05月17日

太行路

太行之路能摧车,若比人心是坦途。
巫峡之水能覆舟,若比人心是安流。
人心好恶苦不常,好生毛羽恶生疮。
与君结发未五载,岂期牛女为参商。
古称色衰相弃背,当时美人犹怨悔。
何况如今鸾镜中,妾颜未改君心改。
为君熏衣裳,君闻兰麝不馨香。
为君盛容饰,君看金翠无颜色。
行路难,难重陈。
人生莫作妇人身,百年苦乐由他人。
行路难,难于山,险于水。
不独人间夫与妻,近代君臣亦如此。
君不见:
左纳言,右纳史。
朝承恩,暮赐死。
行路难,不在水,不在山,只在人情反覆间!

下面用一个简单的例子说明这个过程,共有三个文件:hello.c、dll.h和dll.c。

hello.c 文件内容如下

#include <stdio.h>
#include "dll.h"

int main()
{
    hello();
    return 0;
}

其中,hello()函数是动态连接库提供的函数。

dll.h 文件内容如下

#ifdef BUILD_DLL /* DLL export */
  #define EXPORT __declspec(dllexport)
#else /* EXE import */
  #define EXPORT __declspec(dllimport)
#endif

EXPORT void hello(void);

dll.c 文件内容如下

#include "dll.h"

EXPORT void hello(void)
{
    printf ("Hello\n");
}

三个文件的内容都很简单,无须解释。

编译连接程序

1、编译hello.c
gcc -c hello.c

2、编译dll.c
gcc -c -DBUILD_DLL dll.c

注意要使用要使用-DBUILD_DLL来设置宏BUILD_DLL

3、创建dll
gcc -shared -o message.dll dll.o -Wl,–out-implib,libmessage.a

这一步要详细说明一下

-shared参数用来创建共享库,在windows中为dll
-Wl 等待下一条信息进行连接
–out-implib是给连接程序ld使用的,用于创建要连接dll需要的import library

4、创建可执行文件

gcc -o hello.exe hello.o -L./ -lmessage
-L 指定连接库路径
-lmessage (or -l message) 指定dll的import library

好了,编译连接完成,运行程序

C:\>hello

Hello!

2007年05月09日

我国无一所大学进入世界前100

  上周,中国科学评价研究中心发布了“世界一流大学竞争力排行榜”,北京大学排在第192位,清华大学排在196位。与去年相比,两所学校的排名分别上升了61位和68位。在全球高校500强中,我国18所大学上榜,比去年增加10所。

  排名前10位的分别是:哈佛大学、得克萨斯大学、华盛顿大学、斯坦福大学、约翰·霍普金斯大学、加州大学伯克利分校、加州大学洛杉矶分校、东京大学、密歇根大学、麻省理工学院大学。其中,除了日本的东京大学之外,其余9所全部来自美国。

  中国科学评价研究中心主任、课题组负责人邱均平介绍,这10所大学是从参与评选的1207所大学中产生的,它们代表着世界大学的顶尖水平。“排名前10位的大学学科齐全,并且每个学科影响力都很大。这和平时所见所闻的一些情况不符合。比如麻省理工学院,大家一般认为它学科比较单一,以理工为主,但从原始数据和评价结果来看,它的学科体系齐全,且每个学科的排名都比较靠前。”

  记者了解到,我国没有一所大学进入排行榜前100名。在前400名中,我国大陆地区占8所,分别是:北京大学(192位)、清华大学(196位)、浙江大学(248位)、上海交通大学(252位)、复旦大学(257位)、南京大学(271位)、中国科技大学(273位)和吉林大学(382位)。中国台湾进榜的前三名为:台湾大学、台湾成功大学、台湾清华大学,分别排在第135、295和387位。香港大学(149位)、香港中文大学(198位)和香港科技大学(286位)则排在中国香港地区的前三位。

  从学科排行来看,中国科学院的材料科学排名全球第1位,清华大学排在第19位,中国科学技术大学排在第38位。在物理学方面,中国科学院排名第5位,前4位分别是德国马普学会、俄罗斯科学院、日本东京大学、美国麻省理工学院。在计算机科学方面,清华大学的全球排名是28位,排在前三位的分别是AT&T贝尔实验室、斯坦福大学、麻省理工学院。在工程学方面,清华大学全球排名31位,排名第一到三位的是麻省理工学院、加州大学伯克利分校、伊-利诺伊大学。北京大学在化学学科的全球排名是第73位,南京大学排92位,清华大学排104位。在数学方面,美国哈佛大学排名第一,中国科学院排名22位,北京大学排91位,复旦大学排149位。

  与此同时,课题组以排名前500位的大学作为统计样本,研究发布了“国家科研竞争力排行榜”,美国牢牢占据了榜首位置。在科研生产力、科研影响力、科研创新力、科研发展力4个一级指标中,美国的得分都位居首位。紧随其后的是英国、德国、日本、加拿大、荷兰、瑞士、意大利、法国和瑞典。中国大陆排在第20位,比去年上升1位,中国香港排在第22位,中国台湾排在第27位。

StrCmpLogicalW 是Windows提供的一个字符串比较函数,实现以下排序效果:

传统排序结果
COM1
COM10
COM11
COM2
COM3

StrCmpLogicalW排序结果
COM1
COM2
COM3

COM10
COM11

http://www.codeproject.com/cpp/ListCtrlSort.asp

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef BOOL (*FileProc)(const WIN32_FIND_DATA*, void*);

int ForEachFile(const char* FileSpec, FileProc Proc, void* Param)
{
    WIN32_FIND_DATA wfd;
    HANDLE hFind = INVALID_HANDLE_VALUE;
    int nCount = 0;
 
    hFind = FindFirstFile(FileSpec, &wfd);
    if (hFind == INVALID_HANDLE_VALUE)
        return 0;

    do
    {
        if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
            if (Proc(&wfd, Param))
                nCount++;
        }
    }
    while (FindNextFile(hFind, &wfd) != 0);
    FindClose(hFind);
   
    return nCount;
}

// NN.ext
// Prefix-NN.ext
// NN-Postfix.ext
// Pre-NN-Post.ext
// NNN-NN.ext

BOOL RenameFile(const WIN32_FIND_DATA* wfd, void* param)
{
    char *endptr, *t;
    const char* s;
    char name[MAX_PATH];

    int Width = *(int*)param;

    s = wfd->cFileName;
    t = name;

    while(*s && !isdigit(*s))
        *t++ = *s++;

    if (isdigit(*s))
    {
        long n = strtol(s, &endptr, 10);
        t += sprintf(t, "%0*d", Width, n);
        strcat(t, endptr);

        printf("%s ==> %s\n", wfd->cFileName, name);
        return MoveFile(wfd->cFileName, name);
    }
    return FALSE;
}

int main(int argc, char* argv[])
{
    int Width = 3;
    if (argc > 1) Width = atoi(argv[1]);
    ForEachFile("*.*", RenameFile, &Width);
    return 0;
}

2007年04月15日

用Borland C++编译器生成的DLL文件,都会多出来一个名为___CPPdebugHook的导出函数,谁也不知道这个函数具体有什么作用,这一点令人感觉十分不爽。我也像不少人那样,企图寻找去掉这个函数的方法,但问来问去,也没得到比较满意的答案。据说有个叫PE Creator什么的软件可以做到,但这个软件不是免费软件,对它就不再有兴趣了。

最近发现一个简单、有效、野蛮的方法,可以除去那个神秘的导出函数,方法描述如下:

用一个十六进制编辑器打开DLL文件,查找CPPdebugHook,会有多个,其中有一个位于导出函数区,其周围都是DLL的导出函数名,找到这个地方后停下来,不用再继续找下去了。

这时观察一下,究竟有几个导出函数,要把___CPPdebugHook也算在内,比如说有4个。

在导出函数区附近用眼光扫描一下,看看有没有04这样的字节,当然会有,而且会有两个,不必理会第一个,我们要对付的是第二个,把光标移过去,将04改为03,存盘,退出。

这时你再用tdump、dumpbin之类的程序看看这个DLL,怎么样?那个可恶的CPPdebugHook函数消失了!

这个方法有个限制,CPPdebugHook必须是最后一个导出函数,如果不是这样,这个方法就失灵了,幸运的是,多数情况下,CPPdebugHook都是最后一个导出函数。

 

2006年11月23日

  中新网北京11月22日电(记者 刘育英) 中国互联网协会今日正式公布了最终版本的“恶意软件”定义。自11月8日“恶意软件定义”征求意见稿出台后,协会共收到8500多条反馈意见,将其归纳为50条后进行了讨论。

  经反恶意软件协调工作组讨论确定,恶意软件是指在未明确提示用户或未经用户许可的情况下,在用户计算机或其他终端上安装运行,侵害用户合法权益的软件,但不包含我国法律法规规定的计算机病毒。

  具有下列特征之一的软件可以被认为是恶意软件:

  1.强制安装:指未明确提示用户或未经用户许可,在用户计算机或其他终端上安装软件的行为。

  2.难以卸载:指未提供通用的卸载方式,或在不受其他软件影响、人为破坏的情况下,卸载后仍然有活动程序的行为。

  3.浏览器劫持:指未经用户许可,修改用户浏览器或其他相关设置,迫使用户访问特定网站或导致用户无法正常上网的行为。

  4.广告弹出:指未明确提示用户或未经用户许可,利用安装在用户计算机或其他终端上的软件弹出广告的行为。

  5.恶意收集用户信息:指未明确提示用户或未经用户许可,恶意收集用户信息的行为。

  6.恶意卸载:指未明确提示用户、未经用户许可,或误导、欺骗用户卸载其他软件的行为。

  7.恶意捆绑:指在软件中捆绑已被认定为恶意软件的行为。

  8.其他侵害用户软件安装、使用和卸载知情权、选择权的恶意行为。

  互联网协会称,“‘恶意软件定义’是中国互联网协会反恶意软件协调工作组成员单位和社会各界达成的共识,因此这一定义具有代表性和权威性。”

  反恶意软件协调工作组成员单位代表纷纷表示,将率先按照这一定义规范自己的服务,在相关互联网服务当中发挥表率作用。

  反恶意软件协调工作组成立于10月26日,其成员单位包括新浪、网易、雅虎(中国)、奇虎等。(完)

2006年11月13日

·釉下彩

釉下彩是用彩料在瓷器坯体上直接施彩,然后再罩一层透明釉,人窑后在高温气氛中与瓷器一次烧成的品种。它的突出优点在于不受磨损、永不褪色、无铅无毒、光滑平整、操作简单。据现有的考古资料证明,三国东吴的青瓷器上已有成熟的釉下褐彩生产。元、明、清时期景德镇青花瓷是釉下彩的最成功制作,也是中国瓷器的代表品种之一。釉下彩包括青花、釉里红、釉下三彩、釉下五彩、釉下褐彩、褐绿彩等。


·釉上彩

中低温颜色釉品种之一。指在烧好的素器上彩绘,再经中低温烘烤而成,因彩附着于釉面之上,故名。最早见于宋代,北方民间磁窑烧制的白地上有红绿黑彩绘盘碗或捏塑的彩绘人像。元明清三代景德镇釉上彩日益发展,出现了金彩、斗彩、五彩、素三彩、粉彩、珐琅彩、黑彩、墨彩、杂彩、广彩等许多名贵品种。


·釉中彩

釉中彩类似釉下五彩的绘花和贴花。宋代以前就开始生产,历代属釉中彩品种有:青釉褐斑、白釉绿斑、天蓝釉红斑、褐彩、绿彩、褐绿彩、黑釉铁锈花等。景德镇陶瓷馆古瓷陈列厅中藏有褐条彩十二相属瓷俑和褐点彩鼓钉渣斗。两件宋代青白釉加褐彩作品瓷俑的装饰手法别具一格,俑身着左衽衫,外罩一件宽袖长袍,利用褐色的条彩显示出微风轻拂的衣褶,线条柔和而又简洁。

进入20世纪肋年代,一些瓷器厂家研制成功高温快烧颜料装饰,同样是采用釉中彩绘方法,所用色料非常丰富,也有人把这类装饰方法称作高温釉上彩。经过技术改造后的高档瓷生产厂家,其制作工艺是将施完釉的坯胎先经800℃低温素烧,然后在这种半成品上彩绘,接着在花面上喷一层薄釉,再经高温烧成,从表面看,彩在釉下,实质夹在两层釉的中间,故它称为釉中彩。

    欧洲某些国家的公共交通系统的售票处是自助的,也就是你想到哪个地方,根据目的地自行买票,没有检票员,甚至连随机性的抽查都非常少。一位中国留学生发现了这个管理上的漏洞,或者说以他的思维方式看来是漏洞。他很乐意不用买票而坐车到处溜达,在留学的几年期间,他一共因逃票被抓了三次。

  他毕业后,试图在当地寻找工作。他向许多跨国大公司投了自己的资料,因为他知道这些公司都在积极地开发亚太市场,可都被拒绝了,一次次的失败,使他愤怒。他认为一定是这些公司有种族歧视的倾向,排斥中国人。最后一次,他冲进了人力资源部经理的办公室,要求经理对于不予录用他给出一个合理的理由。

  下面的一段对话很令人玩味。

  先生,我们并不是歧视你,相反,我们很重视你。因为我们公司一直在开发中国市场,我们需要一些优秀的本土人才来协助我们完成这个工作,所以你一来求职的时候,我们对你的教育背景和学术水平很感兴趣,老实说,从工作能力上,你就是我们所要找的人。

  那为什么不收天下英才为贵公司所用?

  因为我们查了你的信用记录,发现你有三次乘公车逃票被处罚的记录。

  我不否认这个。但为了这点小事,你们就放弃了一个多次在学报上发表过论文的人才?

  小事?我们并不认为这是小事。我们注意到,第一次逃票是在你来我们国家后的第一个星期,检查人员相信了你的解释,因为你说自己还不熟悉自助售票系统,只是给你补了票。但在这之后,你又两次逃票。

  那时刚好我口袋中没有零钱。

  不、不,先生。我不同意你这种解释,你在怀疑我的智商。我相信在被查获前,你可能有数百次逃票的经历。

  那也罪不至死吧?干吗那么较真?以后改还不行?

  不、不,先生。此事证明了两点:一、你不尊重规则,不仅如此,你擅于发现规则中的漏洞并恶意使用;二、你不值得信任,而我们公司的许多工作的进行是必须依靠信任进行的,因为如果你负责了某个地区的市场开发,公司将赋予你许多职权。为了节约成本,我们没有办法设置复杂的监督机构,正如我们的公共交通系统一样。所以我们没有办法雇佣你,可以确切地说,在这个国家甚至整个欧盟,你可能找不到雇佣你的公司,因为没人会冒这个险的。
  
    这位仁兄在心中暗骂多声“打倒帝国主义”之后,决定回国发展。由于有着海归派的金字招牌,他成为某个大学的副教授,并有望于最近被提升为教授。