每一个可以努力的日子,都是一份厚礼。
编程
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]; //消息主体 }; |