#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::listil;
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;
}
Func's Blog
2010年9月4日星期六
std::list的排序例程
std::list和std::vector不同,无法使用STL算法库里的sort(),因为std::list不支持随机访问(random access)。
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”,说明这个“移动”操作继承了旧的版本信息。

至此,是不是有种满足感,哈哈。
这种方式是错误的,其实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
你可以把你的显卡信息提交给KluDX网站,以丰富显卡信息数据库。
通过KluDX网站上的显卡信息数据库,可以获得各种性能参数,对开发有一定帮助。
KluDX网站 http://www.kludx.com
2010年6月16日星期三
一个Win32控制台类
对于编写Win32程序,尤其是游戏这种实时性高的程序来说,断点调试未必是最合适的调试方法。很多时候,我们更渴望看到实时打印的调试信息。
一种方法是使用VC的调试函数OutputDebugString(),将信息输出给VC调试控制台。还有一种方法是在Win32控制台工程的基础上创建窗口程序(入口为main而非WinMain)。可以用宏来控制编译,使Debug版本时有控制台,Release版本没有控制台,像这样:
但这种方法并不灵活,这里介绍一个直接用Win32 API获得控制台的方法。一切皆在代码中:
一种方法是使用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文件,即可使用Demo模块。Demo的内部细节被隐藏在demo.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绝不是榜样。
此事一经报出,产生了巨大的震动。受到刺激最大的,是Google的直接用户。Google搜索引擎及GMail等服务,能否继续使用是其一。GMail地址充当常用网络账号的用户,还要付出更换各种网络身份信息的代价。从这个层面来看,Google若退出,除了成就在中国“不作恶”的虚名,带来的都是负面影响。
同时,Google事件对中国官方和社会的冲击,是很大的。从官方角度看,一家代表最高科技的外资企业的逃离,对长期鼓吹的高新科技带动经济的政策,打击很大,同时也损害到市场经济的国际形象。从社会层面看,2009年下半年开始逐步升温的互联网的政策紧缩,触怒到的广大网民,在此事件中,情绪得到彻底的爆发。
官方对互联网进行压制,意图控制舆论,却刺激了舆论,起到相反的效果。我觉得在这方面,官方应该审时度势,认识到真正的网络舆论,是牢牢掌握在每一个普通网民的脑子和手指头上的。和谐,怎么和谐是门学问,搞整网运动,刺激了网民,网民也会运动你。禁了门户报道,以为大吉,是无用的鸵鸟行为。唯有拔网线,才是最靠谱的,但拔得起么?真正能够代表健康的市场经济的,在中国只有一个行业,互联网!8%可没法瞎填出来的。
Google事件,一波三折,现在尚无定局。这也从侧面反映了Google管理层的缺点。一个甚至涉及国际政治的重大决定,公布得如此仓促,过程看起来反复无常。虽然有传闻可解释这种仓促行为,但从已认定的事实来看,Google的决议太草率,方式缺乏严谨性,难免落下各种口实。
日前,美国国务卿做了关于网络自由政策的演讲。Google事件与之难逃干系,会不会因此遭到反扑,比较难说。但不得不指出,美国政府保护的终究是美国人。美国政府有向世界推行自由民主的王霸之心,却没有与之对等的合法性。作为中国人,关注中国的公共事务时,应当尽量避嫌,防止产生负面作用。尤其不要指望美国政府会为中国人提供翻墙利器,不然就是中毒太深。政府这种组织机构,毕竟不是万能的。
Google事件的沸沸扬扬,深层次原因,是改革三十年来,经济建设上积累的矛盾,由此进一步引发的社会矛盾。根子里的矛盾,不可能通过剪除网络舆论这种枝节末梢来解决。政治社会经济的转型迫在眉睫,与之伴随的危机逐渐浮现。这才是我们真正要认真面对的,在这一点上,草率的Google绝不是榜样。
2010年1月11日星期一
2010年1月10日星期日
搭错谁的车?──戏评老片《搭错车》
豆瓣上,大家给以这部电影很高的分数,是冲着父爱这个主题去的。但我猜,大家心中另有想法,压抑住了,没有表达出来。毕竟,这部老电影的叙事手法,以今天的目光看,太拙劣了。
不仅如此,题目也很奇怪。搭错车?搭错谁的车?不会是哑叔的三轮车吧。费劲脑汁,反复看,我才通过一些小细节看出端倪。
我们来分析车。有哪些车?哑叔的三轮,阿明的出租车,时帅哥借来的车,几辆无关紧要的出租车。哈,这下清楚了吧,影片说的搭错车,就是指错上时帅哥的车,错过阿明的车。
时帅哥是怎么出场的?暗无天日的歌厅中,一张脸隐匿在黑影之中。这种场面,是坏人御用的啊。之后时帅哥送阿美回家,来福冲他狂叫,更充分说明了这一点。大家都知道,小动物和小娃娃都是不会撒谎的。
时帅哥这家伙,很不好。人姑娘在台上唱歌,他非要装B一下,告诉人歌唱得不好,来引人注意。借朋友车又不好好爱惜,撞了车,还打人。上了人姑娘,第二天就跑了。这风格,完全是北京城摇滚小青年的范儿啊,太不靠谱了。
再看阿明,多好的小伙。教阿美说话,从小保护阿美。很小就没了爹,照顾自己娘,还把哑叔当爹一样孝顺。疾恶如仇,最后倒在强拆队的淫威下。要多靠谱有多靠谱,要多MAN有多MAN。
如果阿美搭了阿明的车,满婶再与哑叔结合,这一切就完美了,哪有后来那些狗屁倒灶的事。搭错车,导演是这意思!另有二十年后,芝兰阿姨珠光宝气回故地的桥段,我就不展开说了。
最后,导演不忘借有时帅哥的另一身份(文艺小青年),写下《酒干倘卖无》这首词曲,来恶心豆瓣的另一主体用户──文艺小青年们。操,老子的片子明明拍得不怎么样,你们还给这么高的分。导演是这样想的。人都死了嘛,感人能让人复活吗?珍惜当下,别搭错车啊。
(一个豆瓣挨踢男评)
不仅如此,题目也很奇怪。搭错车?搭错谁的车?不会是哑叔的三轮车吧。费劲脑汁,反复看,我才通过一些小细节看出端倪。
我们来分析车。有哪些车?哑叔的三轮,阿明的出租车,时帅哥借来的车,几辆无关紧要的出租车。哈,这下清楚了吧,影片说的搭错车,就是指错上时帅哥的车,错过阿明的车。
时帅哥是怎么出场的?暗无天日的歌厅中,一张脸隐匿在黑影之中。这种场面,是坏人御用的啊。之后时帅哥送阿美回家,来福冲他狂叫,更充分说明了这一点。大家都知道,小动物和小娃娃都是不会撒谎的。
时帅哥这家伙,很不好。人姑娘在台上唱歌,他非要装B一下,告诉人歌唱得不好,来引人注意。借朋友车又不好好爱惜,撞了车,还打人。上了人姑娘,第二天就跑了。这风格,完全是北京城摇滚小青年的范儿啊,太不靠谱了。
再看阿明,多好的小伙。教阿美说话,从小保护阿美。很小就没了爹,照顾自己娘,还把哑叔当爹一样孝顺。疾恶如仇,最后倒在强拆队的淫威下。要多靠谱有多靠谱,要多MAN有多MAN。
如果阿美搭了阿明的车,满婶再与哑叔结合,这一切就完美了,哪有后来那些狗屁倒灶的事。搭错车,导演是这意思!另有二十年后,芝兰阿姨珠光宝气回故地的桥段,我就不展开说了。
最后,导演不忘借有时帅哥的另一身份(文艺小青年),写下《酒干倘卖无》这首词曲,来恶心豆瓣的另一主体用户──文艺小青年们。操,老子的片子明明拍得不怎么样,你们还给这么高的分。导演是这样想的。人都死了嘛,感人能让人复活吗?珍惜当下,别搭错车啊。
(一个豆瓣挨踢男评)
订阅:
评论 (Atom)