正在改寫C#版的ICTCLAS

來源:互聯網
上載者:User
斷斷續續幹了快半個月了。
由於中科院的網站上已經下不到源碼了,所這這個版本基於有雲的地方的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#改寫,有興趣一起做的也請聯絡我。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.