2013年2.23 周六

由于这一周书看的比较少,所以工作中遇到的问题 和 看书看到的新技术就和为一章来写,书看的少的原因:1、近期工作任务比较重,所以很多时间都花在工作上 2、最近笑傲江湖在热播,妹子在看,难免一起看,所以,哈哈 ,这个下周要改

好,回归正题:

遇到的错误和难点:

(1) error:cast from 'char*' to 'int' less precision

这个是用int数值来接受一个char* 类型的变量时报错的,起初用gcc编译的时候,没有问题,后来用g++编译的时候就出问题了。 这个问题很典型,就是32位系统和64位系统的差异。在32位系统中,int为4个字节,char*也为4个字节,所以当两个变量赋值的时候没有问题,但是当移到64位之后,int还是4个字节,但是char*确是有8个字节,这也就导致了标题中的错误。一个兼容跨平台赋值的写法是用long 来接受char*的值,因为对于long和char*来说,在32位和64位上,他们的长度是一样的。所以当我们需要用变量来接收一个指针的时候,最好就是用long 来接收。

(2) linux内核链表的实现

其实上面的一个问题,是在我看linux内核链表实现的一个经典方法的时候发现的。不过那个问题很多人都知道,这里先贴一个linux内核链表的好文章:

http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 这是一篇讲内核链表很不错的文章。

既然说了  linux内核链表的实现  ,这里就说一个内核中最长使用的方法:

(size_t)((type *)0)->member

1. ( (TYPE *)0 ) 将零转型为TYPE类型指针; 
2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 
3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址; 
4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型。巧妙之处在于将0转 换成(TYPE*),结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址;

也就是说,上述表达式的意义就在于,通过一个结构体类一个成员的地址,可以找到这个结构体的入口地址。linux内核中这种做法很多,这确实是一个很巧妙的方法。

这个可以使用的地方很多,比如实现一个定时器来处理一个类的东西,可以讲一个结构放入类中,然后将这个结构的地址放入一个链表中,当遍历链表的找到这个结构的时候,就可以找出这个类的地址,然后做一些处理,类似的应用还有很多。只要理解这个表达式是求出一个类中成员的偏移量,然后通过成员的地址,找到这个类的入口地主。


(3) redis的接口类hiredis的剖析

这里用剖析肯定不恰当,具体就是做了一些实用接口时需要注意的东西。

操作             返回类型                  
set key value   REDIS_REPLY_STATUS(5)   str

exists  key     REDIS_REPLY_INTEGER(3)  integer

del  key REDIS_REPLY_INTEGER(3)  
      integer

lpush  list  value REDIS_REPLY_INTEGER(3)  integer

get  key                 REDIS_REPLY_STRING(1)   str
                                                                                                                                          (这里需要注明一下  及时你的key是一个int  返回值也是REDIS_REPLY_STRING  你需要将这个string转化一下即可)
上述
几个列表的意思如下:

当你操作一个redis语句时,该语句返回的类型是什么,如当你输入  set  key value  redis server 会返回 ‘OK’  当你get key的时候 如果key存在,redis server 会返回该key的值,这里的'OK'和值  对于hiredis来说被分成了许多类型,‘OK’为status, 值为string,  还有del key 会返回整数,为REDIS_REPLY_INTEGER

讲这么多的目的只有一个,除非你不用判断redis执行是否成功,否则你肯定要读取一下redis返回的值,当你选择读取返回值的时候,建议要判断一下是否为你想要的返回值,及判断redisReply->type 是否是你想要的,如果不是,就不要读取了,因为肯定是出问题了。

这个可能即使你不判断也不会出问题,但是redis事关存储,如果此数据灰常的重要,相比还是要谨慎的吧。

(4) 一些小常识

还有一些小常识要记录一下:

GDB调试设置运行时参数  set args * * *  

strcasecmp(char*, char*)  忽略大小写的判断字符串是否相等


以上便是本周学习的知识,对于下周的工作期望,首先先搞定工作的事情,然后看书的任务也不能落下。还有就是,周末可以的话不用刻意看书,多品读下别人写的博客,多写写一些有意义的代码,效果很更好。

加油!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值