这个超级Bug的起因很不容易发现。
如果在使用MemMove的时候,算错了大小,导致写入越界,在使用MemPtrFree释放内存的时候会遇到错误。
实例:写入的时候错误格式是:
MemMove(dst, src, sizeof(TSeqAddr) * m_num - position);
这里的m_num - position忘记使用括号了。结果是第三个参数越界;然后在使用MemPtrFree释放dst的内存时,会遇到错误。这个错误在模拟器上不会报,在实机上立刻重启,无任何错误信息,#*377的结果是Fatal Exception。找到这个Bug花了我整整5个小时的时间。吐血ing....
外一则:
赋值的对象需要重载"=",尤其在使用集合类的时候,否则死得很难看。
2007/01/29
2007/01/23
stage & stage set
今天定义了一套很变态的candidate填充方式。把所有可能拆解的因素都变成可以自定义的。这包括:
源:巨硬特殊的双源工作方式。
alpha/chinese:匹配中文还是英文
搜索模式:包括moreOrEqual, Equal, lessThan, decremental & oneByOne
渐进:all, lastOne, none
这些因素的组合构成一个搜索阶段,SearchStage,一组搜索阶段构成了搜索阶段集,可以完整定义所有可能的搜索组合。
但是在实际使用中,只打算定义两个集,一个是正常模式,一个是强制模式,用户可以在这两个模式之间切换。
源:巨硬特殊的双源工作方式。
alpha/chinese:匹配中文还是英文
搜索模式:包括moreOrEqual, Equal, lessThan, decremental & oneByOne
渐进:all, lastOne, none
这些因素的组合构成一个搜索阶段,SearchStage,一组搜索阶段构成了搜索阶段集,可以完整定义所有可能的搜索组合。
但是在实际使用中,只打算定义两个集,一个是正常模式,一个是强制模式,用户可以在这两个模式之间切换。
2007/01/22
在集合类中使用的对象,务必重载assignment operator
不然会死的很难看。
在集合类重新分配指针的时候,要用到这个函数copy对象。如果系统不指定,那它就采用Copy内存的方式解决,这个最终在对象析构的时候就会崩溃了。
CMol& CMol::operator[](CMol& mol);
在集合类重新分配指针的时候,要用到这个函数copy对象。如果系统不指定,那它就采用Copy内存的方式解决,这个最终在对象析构的时候就会崩溃了。
CMol& CMol::operator[](CMol& mol);
Copy Constructor与Virtual Function
没想到这种格式的写法下:
CString str = "";
编译器是直接调用Copy Constructor。我没有在Copy Constructor中初始化指针,但是在调用的Copy函数中首先释放指针的内存:
if (m_p) MemPtrFree(m_p);
结果就是完蛋了。
另外,所有的Virtual函数在弹出窗口模式下都无法使用,这可能和Virutal Function的表是全局变量有关,对编译原理我不是很熟,猜想应该是这样的原因造成的吧。
CString str = "";
编译器是直接调用Copy Constructor。我没有在Copy Constructor中初始化指针,但是在调用的Copy函数中首先释放指针的内存:
if (m_p) MemPtrFree(m_p);
结果就是完蛋了。
另外,所有的Virtual函数在弹出窗口模式下都无法使用,这可能和Virutal Function的表是全局变量有关,对编译原理我不是很熟,猜想应该是这样的原因造成的吧。
2007/01/20
segment问题及对策
PalmOS有一些比较变态的限制。
象巨硬这样的弹出程序,必须在程序的第一个64K segment。mHard3的算法复杂度提升,完成这个目标颇有一些难度。解决的办法是把哪些不会在 输入时用到的函数,都从类中拿出去,放到一个继承类中。程序的主界面和维护功能,可以使用继承类工作。这样可以尽可能的压缩核心输入用到的数据结构编译后的大小。如果还是不行的话,就职能考虑ARMlet了。
另外今天的好消息是,已经debug到导入导出数据库了。这个工作同时可以检验大量的数据对象操作的代码质量。这部分完成之后,就可以进入输入法部分的Debug了。照目前的进度,应该在春节前有能对付使用的版本了。
象巨硬这样的弹出程序,必须在程序的第一个64K segment。mHard3的算法复杂度提升,完成这个目标颇有一些难度。解决的办法是把哪些不会在 输入时用到的函数,都从类中拿出去,放到一个继承类中。程序的主界面和维护功能,可以使用继承类工作。这样可以尽可能的压缩核心输入用到的数据结构编译后的大小。如果还是不行的话,就职能考虑ARMlet了。
另外今天的好消息是,已经debug到导入导出数据库了。这个工作同时可以检验大量的数据对象操作的代码质量。这部分完成之后,就可以进入输入法部分的Debug了。照目前的进度,应该在春节前有能对付使用的版本了。
2007/01/17
脚手架代码
这个词真是有够形象。
大部分软件在进入Debug阶段的时候都会遇到这个问题。会写一些和主程序没什么关系,但是对于测试来说会带来很大方便的代码。这类代码被称为脚手架代码。因为脚手架代码通常不是最终发布版本的一部分,程序员就很容易偷懒,不做很好的结构设计和封装,不仔细考虑功能的设计,不做严格的错误处理,因为它的用户是非常理解这些代码会发生什么事的人。
当然这在程序开发阶段是正确的。但是谁又能保证在长期的维护阶段一直正确呢?缺乏好的文档和设计,在软件发布了一段时间之后,需要规划新的改进的时候,这些代码通常就很难读了。在一些数据结构被修改之后,这些代码就可能失效。给调试工作带来麻烦。
要知道想盖好一座楼,好的脚手架也是成功的保证。
大部分软件在进入Debug阶段的时候都会遇到这个问题。会写一些和主程序没什么关系,但是对于测试来说会带来很大方便的代码。这类代码被称为脚手架代码。因为脚手架代码通常不是最终发布版本的一部分,程序员就很容易偷懒,不做很好的结构设计和封装,不仔细考虑功能的设计,不做严格的错误处理,因为它的用户是非常理解这些代码会发生什么事的人。
当然这在程序开发阶段是正确的。但是谁又能保证在长期的维护阶段一直正确呢?缺乏好的文档和设计,在软件发布了一段时间之后,需要规划新的改进的时候,这些代码通常就很难读了。在一些数据结构被修改之后,这些代码就可能失效。给调试工作带来麻烦。
要知道想盖好一座楼,好的脚手架也是成功的保证。
2007/01/09
巨硬III进度
元旦没能象预期的一样有大幅度进展,不过进展还是有一些的。今天连续写了5~6个小时,把很关键的candidate填充算法写完了,里面做了一些偷懒的设计,到最终版本的时候还要修改,不过在debug之前,就先这样了。
机器人的设想被推到后面去了。在debug之后再添加这个功能。不过基于拼音的输入法不能指望有多智能,因为要涉及到多音字的问题;如果是形码,那确实可以全自动无错误的学习了,音码理论上不可能完成,实际上应该可以完成一个有些无伤大雅的小错误的实用版本。
填充算法完成之后就剩下后处理了。一个hop算法要完成,不过这个比较简单,词频调整的算法也简单,增加sequence和更改sequence状态的算法有些小麻烦,还有match算法还没写,不过Anyway,这个月应该可以进入调试阶段了。
上次的版本编译后是52K,这里面包含了一个字体,加密的算法,还有图形界面等等;现在的巨硬III已经进展到编译后38K,离最终完成不是很远了。
机器人的设想被推到后面去了。在debug之后再添加这个功能。不过基于拼音的输入法不能指望有多智能,因为要涉及到多音字的问题;如果是形码,那确实可以全自动无错误的学习了,音码理论上不可能完成,实际上应该可以完成一个有些无伤大雅的小错误的实用版本。
填充算法完成之后就剩下后处理了。一个hop算法要完成,不过这个比较简单,词频调整的算法也简单,增加sequence和更改sequence状态的算法有些小麻烦,还有match算法还没写,不过Anyway,这个月应该可以进入调试阶段了。
上次的版本编译后是52K,这里面包含了一个字体,加密的算法,还有图形界面等等;现在的巨硬III已经进展到编译后38K,离最终完成不是很远了。
Subscribe to:
Comments (Atom)
