Func's Blog

2010年9月4日星期六

std::list的排序例程

std::list和std::vector不同,无法使用STL算法库里的sort(),因为std::list不支持随机访问(random access)。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <list>

// 它是个仿函数
struct mycmp {
bool operator()(int* a, int* b) {
return *a < *b;
}
};

int main() {
std::list il;
int ia[10];

time_t t;
time(&t);
srand((unsigned int)t);

printf("Before: ");
for( int i=0; i<10; ++i ) {
ia[i] = rand();
il.push_back(&ia[i]);
printf("%d ", ia[i]);
}
printf("\n");

il.sort(mycmp());

printf("After: ");
std::list::iterator i;
for( i=il.begin(); i!=il.end(); ++i ) {
printf("%d ", **i);
}
printf("\n");

return 0;
}

2010年7月29日星期四

TortoiseSVN下正确地移动文件

TortoiseSVN貌似没有“移动”库里某个文件的功能,很多人采用先把文件复制到目的目录并“增加”进库,再删除原文件的方式,来完成移动操作。

这种方式是错误的,其实TortoiseSVN有“移动”功能。为什么是错误的,一来这种方式移动的文件丢失了版本信息,二来增加的“提交”操作的数据传输量,三来导致中心库的磁盘浪费。TortoiseSVN并非没有“移动”功能,而是隐藏在“改名”操作中。这可能源自UNIX的传统,改名即移动。

下面以一个简单的例子说明TortoiseSVN中的“移动”操作:

1 我希望把工作版本“E:\MyProjects\move\test”中的“test1\a\foo.c”移动到“test2\”下,并改名为“bar.c”


2 使用TortoiseSVN的“改名”功能,输入“../../test2/bar.c”,“..”代表上级目录,目录斜杠采用UNIX风格


3 确定后,原来的目录下,“foo.c”消失了,以“bar.c”为名出现在“test2\”下


4 由于“test1\a\”为空,我不想要这个目录了,所以删去


5 “提交”操作,注意看“变更列表”第三行第三列,“增加(+)”中有加号,这说明这个增加是由“移动”操作导致的,另外写提交日志是好习惯


6 “提交”成功后,看看SVN日志,列表里“/test2/bar.c”那一行的第四列是版本号“1”,说明这个“移动”操作继承了旧的版本信息。


至此,是不是有种满足感,哈哈。

2010年7月6日星期二

Windows下的显卡信息查看工具KluDX

KluDX是一个Windows下的,用于查看显卡信息的工具。

你可以把你的显卡信息提交给KluDX网站,以丰富显卡信息数据库。

通过KluDX网站上的显卡信息数据库,可以获得各种性能参数,对开发有一定帮助。

KluDX网站 http://www.kludx.com

2010年6月16日星期三

一个Win32控制台类

对于编写Win32程序,尤其是游戏这种实时性高的程序来说,断点调试未必是最合适的调试方法。很多时候,我们更渴望看到实时打印的调试信息。

一种方法是使用VC的调试函数OutputDebugString(),将信息输出给VC调试控制台。还有一种方法是在Win32控制台工程的基础上创建窗口程序(入口为main而非WinMain)。可以用宏来控制编译,使Debug版本时有控制台,Release版本没有控制台,像这样:
#ifndef _DEBUG
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
#else
int main(int argc, char** argv) {
#endif//_DEBUG

但这种方法并不灵活,这里介绍一个直接用Win32 API获得控制台的方法。一切皆在代码中:
// DbgCon.h
#ifndef DBGCON_H
#define DBGCON_H

#include <windows.h>
#include <stdio.h>

class DbgCon {
public:
DbgCon();
~DbgCon();

void Show();
void Hide();

void Top();
void NoTop();

private:
HWND HWnd_;
FILE* ConIn_;
FILE* ConOut_;
};

#endif//DBGCON_H

//DbgCon.cpp
#include "DbgCon.h"

DbgCon::DbgCon()
: HWnd_(0)
, ConIn_(0)
, ConOut_(0) {
// 申请一个控制台
if( AllocConsole() ) {
HWnd_ = GetConsoleWindow();
// 把管道转入该控制台
freopen_s(&ConIn_, "CONIN$", "r+t", stdin);
freopen_s(&ConOut_, "CONOUT$", "w+t", stdout);
// 去掉控制台窗口上的关闭功能
//(控制台窗口上的关闭操作会关掉整个进程)
HMENU HMenu = GetSystemMenu(HWnd_, FALSE);
RemoveMenu(HMenu, SC_CLOSE, MF_BYCOMMAND);
}
}

DbgCon::~DbgCon() {
FreeConsole();
if( ConOut_ ) {
fclose(ConOut_);
}
if( ConIn_ ) {
fclose(ConIn_);
}
}

void DbgCon::Show() {
// 显示控制台窗口(恢复到正常状态)
ShowWindow(HWnd_, SW_SHOWNORMAL);
}

void DbgCon::Hide() {
// 隐藏控制台窗口
ShowWindow(HWnd_, SW_HIDE);
}

void DbgCon::Top() {
// 置顶控制台窗口
SetWindowPos(HWnd_, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE);
}

void DbgCon::NoTop() {
// 取消置顶
SetWindowPos(HWnd_, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE);
}

2010年5月16日星期日

C语言对数据的隐藏封装

在C++中,如果我们想把数据结构隐藏起来,只为用户提供接口,可以通过实现继承接口类的方式到达目的。那C中,可以采用什么方式呢。下面有一例:
// demo.h
#ifndef DEMO_H
#define DEMO_H

typedef struct Demo* Demo;

extern Demo DemoCreate(int num);
extern void DemoDestory(Demo demo);
extern void DemoShow(Demo demo);

#endif//DEMO_H

// demo.c
#include "demo.h"
#include <stdio.h>
#include <stdlib.h>

typedef struct Demo_ {
int num_;
} Demo_;

Demo DemoCreate(int num) {
Demo_* demo = (Demo_*)malloc(sizeof(Demo_));
demo->num_ = num;
return (Demo)demo;
}

void DemoDestory(Demo demo) {
free(demo);
}

void DemoShow(Demo demo) {
printf("%d\n", ((Demo_*)demo)->num_);
}

// main.c
#include "demo.h"

int main() {
Demo demo = DemoCreate(888);
DemoShow(demo);
DemoDestory(demo);
return 0;
}

用户只需要有demo.h文件,即可使用Demo模块。Demo的内部细节被隐藏在demo.c中。

2010年5月4日星期二

这一年……

这一年,我来北京了。

顺利找到一份工作。

认识了一些朋友。

听到几首歌……

“我要走在我的路上,我要走在我的路上……”

哈哈~

2010年1月23日星期六

事后诸葛谈Google退出中国事件

  Google退出中国事件,经过了这么多天,情况逐渐明朗起来。Google不采取主动退出中国的激烈行动。同时,与审查制度的(某种程度的)不合作,也被明确地提出来。我想,这是最好的情况。

  此事一经报出,产生了巨大的震动。受到刺激最大的,是Google的直接用户。Google搜索引擎及GMail等服务,能否继续使用是其一。GMail地址充当常用网络账号的用户,还要付出更换各种网络身份信息的代价。从这个层面来看,Google若退出,除了成就在中国“不作恶”的虚名,带来的都是负面影响。

  同时,Google事件对中国官方和社会的冲击,是很大的。从官方角度看,一家代表最高科技的外资企业的逃离,对长期鼓吹的高新科技带动经济的政策,打击很大,同时也损害到市场经济的国际形象。从社会层面看,2009年下半年开始逐步升温的互联网的政策紧缩,触怒到的广大网民,在此事件中,情绪得到彻底的爆发。

  官方对互联网进行压制,意图控制舆论,却刺激了舆论,起到相反的效果。我觉得在这方面,官方应该审时度势,认识到真正的网络舆论,是牢牢掌握在每一个普通网民的脑子和手指头上的。和谐,怎么和谐是门学问,搞整网运动,刺激了网民,网民也会运动你。禁了门户报道,以为大吉,是无用的鸵鸟行为。唯有拔网线,才是最靠谱的,但拔得起么?真正能够代表健康的市场经济的,在中国只有一个行业,互联网!8%可没法瞎填出来的。

  Google事件,一波三折,现在尚无定局。这也从侧面反映了Google管理层的缺点。一个甚至涉及国际政治的重大决定,公布得如此仓促,过程看起来反复无常。虽然有传闻可解释这种仓促行为,但从已认定的事实来看,Google的决议太草率,方式缺乏严谨性,难免落下各种口实。

  日前,美国国务卿做了关于网络自由政策的演讲。Google事件与之难逃干系,会不会因此遭到反扑,比较难说。但不得不指出,美国政府保护的终究是美国人。美国政府有向世界推行自由民主的王霸之心,却没有与之对等的合法性。作为中国人,关注中国的公共事务时,应当尽量避嫌,防止产生负面作用。尤其不要指望美国政府会为中国人提供翻墙利器,不然就是中毒太深。政府这种组织机构,毕竟不是万能的。

  Google事件的沸沸扬扬,深层次原因,是改革三十年来,经济建设上积累的矛盾,由此进一步引发的社会矛盾。根子里的矛盾,不可能通过剪除网络舆论这种枝节末梢来解决。政治社会经济的转型迫在眉睫,与之伴随的危机逐渐浮现。这才是我们真正要认真面对的,在这一点上,草率的Google绝不是榜样。

2010年1月11日星期一

LFS初体验

1 LFS(Linux From Scratch)不是一个Linux发行版

2 它主要是一套帮助从源码构建Linux系统的指导文档

3 其次才是一套为操作提供环境的工具

4 学习LFS这套工具本身一点不难

5 真正的难点在于Linux系统中各个软件包的构建方法

6 要获得构建方法的知识,除了要看LFS文档,还要读程序包自己的文档

7 构建过程十分耗时

8 学习从源码构建Linux系统更耗时

9 去LFS不是必要的,却是值得的

艾未未作品《4851》观后感

艾未未先生的《4851》是我看到的最深刻的艺术作品。

87分钟的片长,可能没几个人会真的花87分钟完整地看完这部片子。

没关系,你的观看方式已经是这部艺术作品的一部分。

这是部完美的艺术作品,像一味催化剂。

只要你对5·12的任何一点有所思考,它都会从理性和感性两方面触发你。

2010年1月10日星期日

搭错谁的车?──戏评老片《搭错车》

  豆瓣上,大家给以这部电影很高的分数,是冲着父爱这个主题去的。但我猜,大家心中另有想法,压抑住了,没有表达出来。毕竟,这部老电影的叙事手法,以今天的目光看,太拙劣了。

  不仅如此,题目也很奇怪。搭错车?搭错谁的车?不会是哑叔的三轮车吧。费劲脑汁,反复看,我才通过一些小细节看出端倪。

  我们来分析车。有哪些车?哑叔的三轮,阿明的出租车,时帅哥借来的车,几辆无关紧要的出租车。哈,这下清楚了吧,影片说的搭错车,就是指错上时帅哥的车,错过阿明的车。

  时帅哥是怎么出场的?暗无天日的歌厅中,一张脸隐匿在黑影之中。这种场面,是坏人御用的啊。之后时帅哥送阿美回家,来福冲他狂叫,更充分说明了这一点。大家都知道,小动物和小娃娃都是不会撒谎的。

  时帅哥这家伙,很不好。人姑娘在台上唱歌,他非要装B一下,告诉人歌唱得不好,来引人注意。借朋友车又不好好爱惜,撞了车,还打人。上了人姑娘,第二天就跑了。这风格,完全是北京城摇滚小青年的范儿啊,太不靠谱了。

  再看阿明,多好的小伙。教阿美说话,从小保护阿美。很小就没了爹,照顾自己娘,还把哑叔当爹一样孝顺。疾恶如仇,最后倒在强拆队的淫威下。要多靠谱有多靠谱,要多MAN有多MAN。

  如果阿美搭了阿明的车,满婶再与哑叔结合,这一切就完美了,哪有后来那些狗屁倒灶的事。搭错车,导演是这意思!另有二十年后,芝兰阿姨珠光宝气回故地的桥段,我就不展开说了。

  最后,导演不忘借有时帅哥的另一身份(文艺小青年),写下《酒干倘卖无》这首词曲,来恶心豆瓣的另一主体用户──文艺小青年们。操,老子的片子明明拍得不怎么样,你们还给这么高的分。导演是这样想的。人都死了嘛,感人能让人复活吗?珍惜当下,别搭错车啊。

(一个豆瓣挨踢男评)