不知道要如何形容我的所谓“非C/C++恐惧症”。似乎在做完一次VHDL作业后这种恐惧更加严重了。因为VHDL简直不是人类应该去理解的语言,因为我实在是搞不懂人类为什么会发明这样傻逼的一种语言来描述硬件。所以在开始钟老师的CAD课的课程设计之前,我还是决定抛弃matlab里丰富的数学函数,决定用C++自己写。
事实上有了SourceForge的话,C++也有着太多现成的东西可用,这使我越来越喜欢所谓open source的精神。我于是有了遗传算法解决TSP问题的用例,还有fga.hpp这个头文件,里面定义了一些关于遗传算法的通用框架。来源是: 特此感谢一下。
以下是对这个还未优化完成的project的总结,因为所说过几天我就会忘了。
一. C++弱智经验(可能真的很弱智,对你来说不算什么,但我是昨天才明白的)
1. 函数参数是指针类型,一定不能直接操作,而要用memcpy拷回去。
如:函数 void random_chromosome(int *chromosome)
调用者先为指针申请了一些int空间,需要在函数里为这些空间填值,一个比较稳妥的做法:
int *temp;
temp = new int[Lenth];
// ....
// 给temp申请到的变量赋值
// ....
mcmcpy(chromosome, temp, L * sizeof(int));
delete[] temp;
2. ofstream作为函数参数时要用写加上'&'
如: void locate(float x, float y, ofstream &outfile);
调用者只需要 locate(x,y,outfile); 即可。
3. 用标准库里的stack,用到自己定义的类型时,比较稳妥的是使用指针类型。
如: Node是用户定义的class
stack B;
Node* tmp1 = new Node(w,h); // Construct function 1
Node* tmp2 = new Node(w,h,left,right); // Construct function 2
B.push(tmp1);
B.push(tmp2);
Node* tmp3 = B.top(); // Get the top of the stack but it doesn't pop out
B.pop(); // pop out the top element
不用指针而直接用Node的话会有隐含错误的可能(大约是当Node这个类里含有指针的时候),先前我这样使用起来,就出现了一个如果不用gdb的话我会一个星期查不出来的bug。
以上内容我参考的是: 这个用来作参考书翻起来实在是爽。
二. gdb的使用
不得不面对这个问题了,这是去年这个时候在丁陈的公司跟夏志锋混的时候没有注意过的。致使我在Linux编程始终处于用cout+printf调试的状态,一个程序待到它调试完毕后,注释代码已经可以和程序长度相当。而使用stack的结构来辅助建造一个树结构的时候,遇到了遍历数的无穷递归,致使我不得不硬着头皮学习使用gdb。(在这里怀念一下Microsoft的Visual Studio)
庆幸的是我找到了太清楚不过的gdb教程,花十分钟便学会了。然后花20分钟解决了这个如果用printf和cout可能要用上一个星期的bug。于是我终于告别了原始的printf+cout调试程序的时代。
gdb使用教程:
好了,最后响应一下open source精神,将我周末写的代码拿出来:
|
文件: |
Floorplan.tar.gz |
大小: |
101KB |
下载: |
下载 | |
当然算法还需要我和解进去改进,因为现在的crossover函数没有任何功效。
做出来的结果竟然是这样的:
阅读(1986) | 评论(0) | 转发(0) |