正在改写C#版的ICTCLAS

断断续续干了快半个月了。
由于中科院的网站上已经下不到源码了,所这这个版本基于有云的地方的C++/CLI版。
原作是比较典型的C式编程方法,常常一个函数上百句。
翻译过程中比较郁闷的地方有以下几点:
1, 原作里处理的字符串都是GBK/GB2312编码的,而C#里字符串都是Unicode格式的,今天为了改编一个函数查了半天的资料,写了个小工具,对着方正GBK字库内码表里的字符,一个个地测试其Unicode码。
原作里字符(逻辑上的)
长度可能为1或2(sizeof(char)),而C#里字符长度永远为1.这样在一些判断条件,循环步长等地方,直能整得人死去活来。
2,不得不说C语言里的指针(比起C#语言里的各种构造)太灵活了,翻译到C#里,可能是数组,可能是ref/out; C语言里的字符串是可变的,C#里的字符串是只读的;这样一来,原文件里某个函数有个char*参数或者局部变量,我就要在接下来的一大串代码中查看这个参数到底是怎么使用的,还要看这个函数的客户在调用完函数之后还有没有使用这个参数,以确定是改成string, ref string, out string还是直接使用char[]. C里的char* + int与C#里的string + int都是合法的操作,但意义完全不同,一不小心没改过来,三两个小时也不一定能找出错在哪里。
3,C的库函数在C#中没有(当然也不可能有)完全对应的实现。比如strlen,要想在各种情况下得到与原作相同的结果,肯定不能改写成*.Length,只能参考C标准库函数的说明用C#重新实现一遍。
4,C语言的多维数组与C#里的多维数组(非锯齿型)基本上是相同的,但是在C里你可以轻松地取出一行数据(比如:int aaa[10][10]; 你可以用 aaa[3]来取得10行里的一行),在C#里,我还真不知道怎么实现。最后我使用了一个二维数组加第一维的索引两个参数来取代。
5,C++里有那么多的构造函数,什么拷贝构造函数,什么赋值构造函数,还能重载操作符=,C#里边完全没有对应的东西,而且VS2005对C++代码也不能查找Operator=的引用,只能靠眼睛去一个个找。
6,VS2005太不稳定了,动不动就死,现在每次调试,执行到某个代码行,必死无疑。
这样每次搞到快吐血,赶紧扔下不管,玩几局魔兽,看看电影,总算坚持下来了。

目前进度:所有CPP代码都已经有了对应的CS代码(可编译通过)。
Dictionary类和ContextStat类的Load,Save等功能已经测试通过。

尚未完成:调试代码使之能正常工作。

此版本完成后将免费开源发放,有愿意帮我减轻点负担的可以联系我(deerchao at gmail dot com)。

另,如果以后有时间,我还准备把HtmlTidy完全使用C#改写,有兴趣一起做的也请联系我。

posted on   deerchao  阅读(3825)  评论(3编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
< 2006年11月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9

统计

点击右上角即可分享
微信分享提示