每一個可以努力的日子,都是一份厚禮。
編程
Code is Poetry.
struct類型的全局變量初始化
2010 11月 7th
今天在實現一個隊列時犯了一個很傻逼的錯誤。一個定義為struct類型的全局變量,我在想定義完後立刻初始化,就寫成類似下面這種樣子:
struct { int i; int j; } test; test.i = 1; test.j = 1; |
結果gcc編譯器報錯,“initializer element is not constant”
在我的實際情況中,test的成員變量i和j也為strcut類型,報的錯為“struct expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘”
真神奇,int char類型都可以直接初始化,struct類型就不行。
最後在http://bbs.chinaunix.net/thread-1285396-1-1.html的4樓找到了說法。全局變量在編譯時就必須確定其值,故C有靜態存儲區數據必須用常量初始化的規定。
其實很簡單, 在全局空間定義struct test,然後再寫一個初始化函數對test進行賦值就可以了。
搜狗雲輸入法的終端接口腳本
2009 11月 30th
搜狗雲輸入法,來自http://pinyin.sogou.com/cloud
update:今天官方又出了個Firefox的“插件”。拜託,這東西應該被叫做擴展。還是個概念產品,然後就已經被linux fans嵌入到ibus里了(比如這裡以及這裡),這裡有個示例性的腳本: 更多 >
compareTo方法出現“無法取消引用”的錯誤
2009 9月 4th
今天在寫一個類型時,需要覆寫compare方法,源代碼如下:
1 2 3 4 5 6 | public int compare(Object arg0, Object arg1){ Student stu0 = (Student)arg0; Student stu1 = (Student)arg1; int flag = stu0.TotalScore.compareTo(stu1.TotalScore); return flag; } |
編譯的時候,出現了”無法取消引用”的錯誤,經檢查,發現原來是一個低級的錯誤,compareTo的方式是對象的方法,而我直接用的是基本數據類型(即代碼中的TotalScore,定義為double類型),將其封裝到對象中即可解決問題。
1 2 3 4 5 6 | public int compare(Object arg0, Object arg1){ Student stu0 = (Student)arg0; Student stu1 = (Student)arg1; int flag = (Double.valueOf(stu0.getTotalScore())).compareTo(Double.valueOf(stu1.getTotalScore())); return flag; } |
Socket編程中用send發送結構體
2009 8月 20th
本文轉載自http://tech.ddvip.com/2008-10/122543769687623.html
最近在開發一個Linux下的聊天軟件,好久沒有做C語言的開發了,感覺到很多東西已經生疏了,這下又碰到用Socket傳遞結構體的問題,google了一下,發現也有不少朋友遇到同樣的問題,所以就打算寫出自己的解決辦法,跟大家分享。
Socket中的send函數可以發送字符串,但不能直接發送結構體,因此在發送端先把結構體轉成字符串,然後用send發送,在接收端recv字符串,再轉換成原先的結構體,這個就是解決問題的主要思路,實現中要注意的問題在下文闡述。
為了客戶端之間能夠互相通信,實現私聊,我採用服務器轉發的方式,因此用戶發送的每條消息中除了消息主體外,還必須包含有發送者、接收者ID等信息,如此採用結構體便是最佳的辦法了。我定義的結構體如下:
struct send_info { char info_from[20]; //發送者ID char info_to[20]; //接收者ID int info_length; //發送的消息主體的長度 char info_content[1024]; //消息主體 }; |