Jun
2
之前写了一篇 myftp: 一个linux下简单的ftp客户端实现
里面详细介绍了ftp协议的基本工作过程。
为了明天晚上的Windows下的程序,于是把它移植到了Win32下面。
然后异常庆幸我当时做了多么明智的封装啊,只要稍稍改几行就可以在windows下面编译了 :D
这个压缩包在Windows和Linux下面都可以直接make编译了哈^_^
不过这次的修改只是增加跨平台编译,没有修正myftp的BUG,仅供参考 :D
下载文件 (已下载 1558 次)
里面详细介绍了ftp协议的基本工作过程。
为了明天晚上的Windows下的程序,于是把它移植到了Win32下面。
然后异常庆幸我当时做了多么明智的封装啊,只要稍稍改几行就可以在windows下面编译了 :D
这个压缩包在Windows和Linux下面都可以直接make编译了哈^_^
不过这次的修改只是增加跨平台编译,没有修正myftp的BUG,仅供参考 :D

Jun
1
1。
很happy,哈哈。
刚刚看 /usr/include/c++/4.3/bits/stl_stack.h
发现原来stack和queue使用的底层容器默认是deque,名字是c, 而且是protected
@ 2009-06-29 p.s.
其实这是件很挫的事情,STL容器的析构函数不是虚函数,继承自他们的子类的析构函数不会被调用,有可能导致内存泄露。
2。
看侯捷大神的《STL源码剖析》以及GCC的STL源码后凑出来的这一段代码。调用 printBufSize() 后输出应该是512。
这个要追溯到一周前和sandy的一个小争论。
记得以前看到过deque的底层实现是分多段连续空间的,以达到高效的首尾增删以及可以接受的随机访问效率
输出的这个512就是SGI STL的默认分段大小。
但是sandy却说,所谓的“分段连续”实际上是分成两段 (听起来就觉得不太对头 -__- )
于是今天特地翻出这本书膜拜一下。当然,不排除其他STL实现使用分两段的可能性,但是这个效率恐怕就不太对劲了。
class mystack: public stack<int>{
public:
int & operator[](unsigned int i){
return c[i];
}
};
public:
int & operator[](unsigned int i){
return c[i];
}
};
很happy,哈哈。
刚刚看 /usr/include/c++/4.3/bits/stl_stack.h
发现原来stack和queue使用的底层容器默认是deque,名字是c, 而且是protected
@ 2009-06-29 p.s.
其实这是件很挫的事情,STL容器的析构函数不是虚函数,继承自他们的子类的析构函数不会被调用,有可能导致内存泄露。
2。
class t: public deque<char>{
public:
void printBufSize(){
std::cout << __deque_buf_size(sizeof(char)) << endl;
}
};
public:
void printBufSize(){
std::cout << __deque_buf_size(sizeof(char)) << endl;
}
};
看侯捷大神的《STL源码剖析》以及GCC的STL源码后凑出来的这一段代码。调用 printBufSize() 后输出应该是512。
这个要追溯到一周前和sandy的一个小争论。
记得以前看到过deque的底层实现是分多段连续空间的,以达到高效的首尾增删以及可以接受的随机访问效率
输出的这个512就是SGI STL的默认分段大小。
但是sandy却说,所谓的“分段连续”实际上是分成两段 (听起来就觉得不太对头 -__- )
于是今天特地翻出这本书膜拜一下。当然,不排除其他STL实现使用分两段的可能性,但是这个效率恐怕就不太对劲了。
May
31
东华比赛总结 By Felix021 @ 70km??
首先批一下主办方。。。整个比赛过程都好挫,包括比赛的衣服、证书、没有队牌、不发餐券、让参赛选手站在赛场外面等、打印很麻烦、工作人员不太负责、发的点心是很挫的饼干而且还是比赛快结束了才发下来(以及水)、比赛结束后就散了,证书也不知道怎么着、题目非常囧。。。。。。(400米的报名费阿,相当相当地不值得)
然后批一下自己吧。。。整个比赛过程也好挫,纠结在一道最后才有一只队伍出的数学题目上,WA了5次最后还是没过。。。严重失误,嗯。
正式过程是这样的,首先是练习赛,A+B不说了,接下来一道很麻烦的模拟题,写了100多行的代码调了半天还没调对头就结束了- -|| 不过新版本的PC^2做的很不错阿,可以直接compile & run & test,题目也直接显示在侧边,用起来很方便。
12点开始正式比赛,10道题目,我看ABCD,jieyu看EFG,yihong看HIJ。A题是求生成树的数量,yihong和jieyu都看过那篇论文,但是忘了具体怎么做。B是一个SB题,看到有队伍AC了,马上写,提交,AC。C题是一个计算几何,给出一个圆的半径和三角形的三条边,求二者可能交叉的最大面积,这题只有6提交,0AC。D题是一个概率论的题目,数学盲飘过。。E题也很囧,给你一个n,要求用加减乘除最后能组合出多少种不同的算式,0提交。F题就是我们一直纠结的那道数学题了,因式分解(x^n-1),我和yihong想得非常深了,已经几乎完全确定没有问题了,但是最后还是WA了,非常无语。G题是一个简单的模拟,暴力一下就行了,jieyu写的,WA了一次很郁闷,我看了下他的代码,发现是边界条件写错了,改了两个地方,AC。H题比较像是线段树的题目,但是在具体实现上感觉又很困难,我写了一点写不下去了(其实根本就不该写,另一个失误),最后的rank显示这题是84提交0AC。I题是另一个数学题,要求[a,b]之间所有数字化成最小底数后的幂的和,数据量太大,没有想法。最后J题,算是计算几何吧:求钟表指针的重心从time1到time2经过的路程;这描述一看就觉得太TM复杂了,这是怎样一个弧线,算个毛阿。于是就一直没去想,但是3个小时左右的时候收到一个说明,每一秒内的运动按直线算----其实这样的话这提就比较简单了,最后AC率超过50%,不过当时一直在想F,所以没有去看那题,又一个大失误。
于是最后只出2题,Rank35,按照10%,20%,30%的比例,108支队伍,我们应该就是铜牌开始的那几个了,sigh。
总的来说这次比赛结果不太好,有两个原因:
1。偏题:题目都靠近计算几何、数学题,看不到经典的DP和图论,于是我们三个都挂了。
2。决策失误,以上详细说明了,很遗憾,否则我们至少应该能出3题。
首先批一下主办方。。。整个比赛过程都好挫,包括比赛的衣服、证书、没有队牌、不发餐券、让参赛选手站在赛场外面等、打印很麻烦、工作人员不太负责、发的点心是很挫的饼干而且还是比赛快结束了才发下来(以及水)、比赛结束后就散了,证书也不知道怎么着、题目非常囧。。。。。。(400米的报名费阿,相当相当地不值得)
然后批一下自己吧。。。整个比赛过程也好挫,纠结在一道最后才有一只队伍出的数学题目上,WA了5次最后还是没过。。。严重失误,嗯。
正式过程是这样的,首先是练习赛,A+B不说了,接下来一道很麻烦的模拟题,写了100多行的代码调了半天还没调对头就结束了- -|| 不过新版本的PC^2做的很不错阿,可以直接compile & run & test,题目也直接显示在侧边,用起来很方便。
12点开始正式比赛,10道题目,我看ABCD,jieyu看EFG,yihong看HIJ。A题是求生成树的数量,yihong和jieyu都看过那篇论文,但是忘了具体怎么做。B是一个SB题,看到有队伍AC了,马上写,提交,AC。C题是一个计算几何,给出一个圆的半径和三角形的三条边,求二者可能交叉的最大面积,这题只有6提交,0AC。D题是一个概率论的题目,数学盲飘过。。E题也很囧,给你一个n,要求用加减乘除最后能组合出多少种不同的算式,0提交。F题就是我们一直纠结的那道数学题了,因式分解(x^n-1),我和yihong想得非常深了,已经几乎完全确定没有问题了,但是最后还是WA了,非常无语。G题是一个简单的模拟,暴力一下就行了,jieyu写的,WA了一次很郁闷,我看了下他的代码,发现是边界条件写错了,改了两个地方,AC。H题比较像是线段树的题目,但是在具体实现上感觉又很困难,我写了一点写不下去了(其实根本就不该写,另一个失误),最后的rank显示这题是84提交0AC。I题是另一个数学题,要求[a,b]之间所有数字化成最小底数后的幂的和,数据量太大,没有想法。最后J题,算是计算几何吧:求钟表指针的重心从time1到time2经过的路程;这描述一看就觉得太TM复杂了,这是怎样一个弧线,算个毛阿。于是就一直没去想,但是3个小时左右的时候收到一个说明,每一秒内的运动按直线算----其实这样的话这提就比较简单了,最后AC率超过50%,不过当时一直在想F,所以没有去看那题,又一个大失误。
于是最后只出2题,Rank35,按照10%,20%,30%的比例,108支队伍,我们应该就是铜牌开始的那几个了,sigh。
总的来说这次比赛结果不太好,有两个原因:
1。偏题:题目都靠近计算几何、数学题,看不到经典的DP和图论,于是我们三个都挂了。
2。决策失误,以上详细说明了,很遗憾,否则我们至少应该能出3题。
May
29
前天在火车上想到的一点东西。
1。命令模式
定义一个抽象类(或者接口@Java)为所有类型的下落物件,包含一些方法诸如旋转,下落,左右移动等,使得具体的开发过程中只需要根据该抽象类编码,实现了解耦,也就可以更方便地添加各种类型的下落物件。
2。工厂模式
使用工厂模式来(随机地)生成下落物件,那么在主程序中就完全和具体的下落物件解耦了。
3。是否需要单件模式
如果说把容纳所有小方块的面板设计为一个class,那么它确实只能生成一个;但是似乎程序中不至于出现要实例化它两次的情况。
对于下落物件,在每次操作过程中确实只有一个,但是有些扩展设计可以显示出下一个下落物件,所以单件模式恐怕不好使。
是不是有一句话说,如果过度使用单件模式,那么程序就是有问题的?
4。一些其他的东西。
图形的实现。
我还是不喜欢用图形库,要去搞懂怎么用图形库显示一个东西,我实在没兴趣。
但是如果用字符实现的话,可能会因为刷屏导致很闪- -||
此外,怎么捕获控制台下的按键?这个一直没去研究过。。。虽然用tc很简单,但是程序写起来会很挫。。。
1。命令模式
定义一个抽象类(或者接口@Java)为所有类型的下落物件,包含一些方法诸如旋转,下落,左右移动等,使得具体的开发过程中只需要根据该抽象类编码,实现了解耦,也就可以更方便地添加各种类型的下落物件。
2。工厂模式
使用工厂模式来(随机地)生成下落物件,那么在主程序中就完全和具体的下落物件解耦了。
3。是否需要单件模式
如果说把容纳所有小方块的面板设计为一个class,那么它确实只能生成一个;但是似乎程序中不至于出现要实例化它两次的情况。
对于下落物件,在每次操作过程中确实只有一个,但是有些扩展设计可以显示出下一个下落物件,所以单件模式恐怕不好使。
是不是有一句话说,如果过度使用单件模式,那么程序就是有问题的?
4。一些其他的东西。
图形的实现。
我还是不喜欢用图形库,要去搞懂怎么用图形库显示一个东西,我实在没兴趣。
但是如果用字符实现的话,可能会因为刷屏导致很闪- -||
此外,怎么捕获控制台下的按键?这个一直没去研究过。。。虽然用tc很简单,但是程序写起来会很挫。。。
May
27
May
27
话说今晚用visio 2007画张图,看那两本书看得我是死去活来啊(就是说半途睡着了一次)
一本是《深入理解Linux内核》,一本是《深入理解Linux虚拟内存管理》,书名都差不多,内容也差不多郁闷。
最后理出来这些东西凑进了图里:
init_tast, double circular linked list, process descriptor, mm_struct, pgd, pt, page ...
一本是《深入理解Linux内核》,一本是《深入理解Linux虚拟内存管理》,书名都差不多,内容也差不多郁闷。
最后理出来这些东西凑进了图里:
init_tast, double circular linked list, process descriptor, mm_struct, pgd, pt, page ...
May
25
前些天在《Head First设计模式》上看到了这一原则。
书上的例子非常好,鸭子的飞行行为和嘎嘎叫的行为确实可以从父类继承得到
但是如果出现橡皮鸭子,它不会叫也不会飞,如果要把它归类为鸭子,那么代码就有得写了(更详细内容参见该书)。
今天突然想起另外一个问题,某天看到一句话:Java采用接口,避免了多继承带来的问题。
于是去Google了一下多继承存在的问题,然后就发现,除了继承带来的冗余数据和方法之外,另一个大问题就是钻石问题。
@ 2009-05-26 下面举的例子有点问题,详情参见篇后sandy的评论
话说端午节快到了,该是吃粽子的时候了——
我们知道米饭和豆沙都是(继承)食品,然后我们用米饭包住豆沙放在锅里蒸一下,我们就得到了(派生)粽子。
这样的结构是:
食品
/ \
米饭 豆沙
\ /
粽子
这是一个菱形,于是被成为钻石问题:如果食品里有一个成员 "好吃程度",那么粽子的"好吃程度"是继承自哪一个呢?
在C++这个支持多继承的语言里面,如果直接使用
然后就会发现编译器(g++)报错:对成员"好吃程度"的请求有歧义(ambiguous)。
不过好在有3个解决方式:
1。重新定义一个好吃程度覆盖米饭和豆沙的好吃程度。
2。指明是哪个父类的好吃程度:例如 粽子a.米饭::好吃程度 或者 粽子a.豆沙::好吃程度
3。使用虚拟继承(虚基类),详情请STFW。
于是我突然想到其实这里如果使用"多用组合,少用继承"的设计原则(很像解决方法2),那么问题就解决拉:
当然这只是一个很初步的想法,代码也非常不严谨,谨以此抛砖引玉,欢迎交流。
书上的例子非常好,鸭子的飞行行为和嘎嘎叫的行为确实可以从父类继承得到
但是如果出现橡皮鸭子,它不会叫也不会飞,如果要把它归类为鸭子,那么代码就有得写了(更详细内容参见该书)。
今天突然想起另外一个问题,某天看到一句话:Java采用接口,避免了多继承带来的问题。
于是去Google了一下多继承存在的问题,然后就发现,除了继承带来的冗余数据和方法之外,另一个大问题就是钻石问题。
@ 2009-05-26 下面举的例子有点问题,详情参见篇后sandy的评论
话说端午节快到了,该是吃粽子的时候了——
我们知道米饭和豆沙都是(继承)食品,然后我们用米饭包住豆沙放在锅里蒸一下,我们就得到了(派生)粽子。
这样的结构是:
食品
/ \
米饭 豆沙
\ /
粽子
这是一个菱形,于是被成为钻石问题:如果食品里有一个成员 "好吃程度",那么粽子的"好吃程度"是继承自哪一个呢?
在C++这个支持多继承的语言里面,如果直接使用
粽子 粽子a;
cout << 粽子a.好吃程度 << endl;
cout << 粽子a.好吃程度 << endl;
然后就会发现编译器(g++)报错:对成员"好吃程度"的请求有歧义(ambiguous)。
不过好在有3个解决方式:
1。重新定义一个好吃程度覆盖米饭和豆沙的好吃程度。
2。指明是哪个父类的好吃程度:例如 粽子a.米饭::好吃程度 或者 粽子a.豆沙::好吃程度
3。使用虚拟继承(虚基类),详情请STFW。
于是我突然想到其实这里如果使用"多用组合,少用继承"的设计原则(很像解决方法2),那么问题就解决拉:
class 粽子: public 食品{
private:
米饭 米饭a;
豆沙 豆沙a;
public:
粽子(){
好吃程度 = (米饭a.好吃程度 + 豆沙a.好吃程度) / 2; //其实我觉得豆沙a的权值应该大些=.=
}
};
private:
米饭 米饭a;
豆沙 豆沙a;
public:
粽子(){
好吃程度 = (米饭a.好吃程度 + 豆沙a.好吃程度) / 2; //其实我觉得豆沙a的权值应该大些=.=
}
};
当然这只是一个很初步的想法,代码也非常不严谨,谨以此抛砖引玉,欢迎交流。
May
25
开始学习winsock(应付网络程序设计的大作业)
在网上搜"winsock 入门",然后都是一堆很ooxx的东西,反正你看了就是不知道怎么写程序就是了。
试着写下一些代码,却发现出现一堆类似
这样的错误。
Google了一下,众说纷纭啊,有说extern "C"的,有说少lib路径的
最后在CSDN的论坛上发现有个人遇到这个问题,贴了个程序,后面别人给的建议有效了:
编译:
C:\code\> g++ a.cpp -lwsock32
加上libwsock32的库即可。。。汗。
在网上搜"winsock 入门",然后都是一堆很ooxx的东西,反正你看了就是不知道怎么写程序就是了。
试着写下一些代码,却发现出现一堆类似
引用
undefined reference to `socket@12'
undefined reference to `htons@4'
undefined reference to `htons@4'
Google了一下,众说纷纭啊,有说extern "C"的,有说少lib路径的
最后在CSDN的论坛上发现有个人遇到这个问题,贴了个程序,后面别人给的建议有效了:
#include<iostream>
#include<windows.h>
#include<winsock.h>
using namespace std;
int main() {
WSADATA wsaData;
WSAStartup(MAKEWORD(1,1),&wsaData);
cout<<"hello"<<endl;
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in host;
int port = htons(8080);
}
#include<windows.h>
#include<winsock.h>
using namespace std;
int main() {
WSADATA wsaData;
WSAStartup(MAKEWORD(1,1),&wsaData);
cout<<"hello"<<endl;
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in host;
int port = htons(8080);
}
编译:
C:\code\> g++ a.cpp -lwsock32
加上libwsock32的库即可。。。汗。