Archive for April, 2007

Judith

You’re such an inspiration for the ways
That I’ll never ever choose to be
Oh so many ways for me to show you
How the savior has abandoned you
F*ck your God
Your Lord and your Christ
He did this
Took all you had and
Left you this way
Still you pray, you never stray
Never taste of the fruit
You never thought to question why

It’s not like you killed someone
It’s not like you drove a hateful spear into his side
Praise the one who left you
Broken down and paralyzed
He did it all for you
He did it all for you

Oh so many many ways for me to show you
How your dogma has abandoned you
Pray to your Christ, to your god
Never taste of the fruit
Never stray, never break
Never—choke on a lie
Even though he’s the one who did this to you
You never thought to question why

Not like you killed someone
It’s Not like you drove a spiteful spear into his side
Talk to Jesus Christ
As if he knows the reasons why
He did it all for you
Did it all for you
He did it all for you

Leave a comment

快快长大

小小豆芽, 快快长大
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-_-

1 Comment

Sooner or Later we all die

so we depart from each other,
still the earth is spinning,
wish we would be able to
say hello to each other in the hell. 
 
DO u feel me?
 
no pain
no sufferring,
cause we are demons,
we slaughter anyone who stands in our way.
 
DO u feel me?

Leave a comment

c++的几种cast zz

先看看这篇文章,然后说一下问题:

 

一共四种cast1static_cast,支持子类指针到父类指针的转换,并根据实际情况调整指针的值,反过来也支持,但会给出编译警告,它作用最类似C风格的“强制转换”,一般来说可认为它是安全的;2dynamic_cast,支持子类指针到父类指针的转换,并根据实际情况调整指针的值,和static_cast不同,反过来它就不支持了,会导致编译错误,这种转换是最安全的转换;3reinterpret_cast,支持任何转换,但仅仅是如它的名字所描述的那样“重解释”而已,不会对指针的值进行任何调整,用它完全可以做到“指鹿为马”,但很明显,它是最不安全的转换,使用它的时候,你得头脑清醒,知道自己在干什么;4const_cast,这个转换能剥离一个对象的const属性,也就是说允许你对常量进行修改。

 

这样回答即使得不了满分,拿个八九十分应该也没问题了,我后来还专门写了些测试程序来验证过,对于第一第二第三种转换都没什么问题,而const_cast却似乎不能正常工作,代码如下:

int main(int argc, char* argv[])

{

     const int ic=100;

     const_cast<int &>(ic)=200;

     printf("%dn", ic);

     return 0;

}

 

结果不是我期待的200,而是100,我一开始以为这是由于优化选项的问题,于是调整编译器选项,全部不优化,但还是一样的结果,我开始怀疑这是VC++bug,于是使用Linuxg++来编译,结果一样,看来这和编译器没有关系,那我究竟做错了哪里呢?或者我对const_cast理解错了呢?我开始改进我的代码,我尝试不同的类型:

class CTest

{

public:

     CTest(int i){m_val = i;printf("construction [%d]n", m_val);};

     ~CTest(){printf("destructionn");};

     void SelfAdd(){m_val++;};

     int m_val;

};

 

int main(int argc, char* argv[])

{

     const CTest test(1000);

     CTest test2(1050);

     const_cast<CTest &>(test)= test2;

     printf("%dn", test.m_val);

     return 0;

}

 

这次总算得到了我想要得到结果,打印出了1050,说明const_cast并没有问题,但前一个程序为什么不能正常工作?我继续尝试了不同的类型,比如charshortfloatdouble等,发现了规律,凡是对结构体或类进行这个转换,都是成功的,但对charshort等基本类型的转换都没有成功。我进一步改进代码,为了查看它们的值是否真的已经被修改,我使用了指针:

int main(int argc, char* argv[])

{

     const int ic = 100;

     const int *pc=&ic;

     const_cast<int &>(ic)++;

     printf("%d,%dn", ic, *pc);

     return 0;

}

 

这次打印出来的结果是“100,101”,这就说明常量ic的值确实已经被改变了,但为什么直接打印ic就得不到正确的结果?那估计还是前边想到的“优化”的原因,可我一再确认我并没有使用优化编译选项,而且g++的表现也如此。看来只好使用最后一招了,直接查看printf究竟做了些什么,在printf处设置断点,调试程序,然后打开disassembly视图查看反汇编代码,一切真相大白。

 

原来虽然我没有使用优化,但系统还是对ic这个const进行了预编译般的替换,将它替换成“64h”(十六进制的64就是十进制的100),这究竟是不是C++的规范?我不知道,但我肯定这不是一般用户想要的结果,对我来说,算是个C++bug吧。通过解决这个问题,我也学会了些东西,如果以后遇到类似这种表面上再显浅不过,但就是不能正常工作的代码片断,要学会查看反汇编代码,也许一切问题迎刃而解,另外使用const_cast的时候应该注意些什么东西,嗯,自己思考一下吧。Java没有const_cast,很多语言都没有,(我只知道C++有)既然已经被定义为常量,就是不希望它被改变,但现在又允许你改变它,这不是很可笑吗?但难道它不是C++强大又灵活的又一体现吗?不过话说回来要看你怎么用了。

 

好了,文章说的很清楚,const_cast可以修改常量,可以修改类,不过这里主要出现的问题就是编译器的处理。

试想如果这样写代码:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

     const volatile int ic = 100;//volatile

     const volatile int *pc=&ic;

     const_cast<int &>(ic)++;

     printf("%d,%dn", ic, *pc);
     system("pause");
     return 0;

}

程序就会输出101,101,因为volatile以后,跳过了编译器指定寄存器中的内容,直接取的内存中数值,所以文章中之所以总会出现ic原来的值,是因为寄存器中值的假象。手头没有vc++不知道debug模式下,const_cast之后,printf会不会调用内存值。而对于类,个人认为类每次取的值不可能在寄存器中,应该是每次取一次内存,所以不会出现假象

Leave a comment

经典语录zz from lqqm

     1.东*突又开始筹集军费了——返校回来的公交车上,书包再次被维族小偷光顾……(日月光华 作者:jsjs)
  2.千万别考北邮,就是考——也要先早恋!!!(北邮人)
  3.妹妹看完几个我在大学交的女友照片后,一个劲地夸我不好色,555……(我爱南开 作者:Winmole)
  4.大学里,骑自行车的可能是个博导,而开奔驰的则可能是个后勤……(蓝色星空 作者:vitamine)
  5.刚交的gf跟我才确定一周的关系就要和我分手,就因为我没读过奥克塔维奥·帕斯的书和博尔赫斯的诗……(饮水思源 作者:seemly)
  6.小时候奶奶常说剩饭脸上会长麻子,所以打小我就不敢剩;后来奶奶说剩饭以后嫁的人会长,就更不敢了!(水木社区 作者:sea99)
  7.我左八荣,右八耻,三个代表在腰间,一团和谐在胸口,人挡杀人,佛挡杀佛!(百度 作者:wen327)
  8.女生就像中秋的月饼,过了十五的晚上就不值钱了……(日月光华)
  9.饭卡放到打卡机里没反应,食堂大师傅小声道:“你搓搓再插~”我搓了搓再插,果然有反应了~(隐讳,紫丁香 作者:Zn)
  10.初访交大的女外教惊声尖叫道:“Oh,My GOD!中国有11亿人在搞异性恋!交大一个年级四千人竟然就有三千多,这太可怕啦!” (兵马俑 作者:raistlinlhx)
  11.一张盗版的windows光盘上写着:“正版费用我们在清王朝时已经付过了,所以无须激活,尽请放心使用!” (两全其美)
  12.我花8万买了个西周陶罐,昨儿到《鉴宝》栏目进行鉴定,专家严肃地说:“这哪是西周的?这是上周的!”(天涯娱乐八卦 作者:静水流深z)
  13.应聘会上,HR面露难色地说:“如果不收你违约金的话,那这公司的人岂不都走光了……”(水木社区)
  14.早晨懒床,遂从口袋里掏出6枚硬币:如果抛出去六个都是正面,我就去上课!思躇良久,还是算了,别冒这个险了……(我爱南开 作者:yiruo)
  Copyright &copy; 天涯社区开心乐园(C_chairman/chai2001),若他人进行商业投稿,我们除保留追诉权力外并预祝您一出门就幸运地碰到上帝!
  15.最受不了这样的商家——牌子上写道:拆迁,给钱就卖!一件羽绒服我甩给她5块她就是不卖,太欺诈消费者了!(水木社区 作者:yutourr)
  16.高考成绩出来后,老师长舒了一口对偶说:“其实没考上,对你和××大学都是一种幸福~”(小百合 作者:xjtuian)
  17.老婆破天荒地第一次支持我买车——赶紧买辆车吧,这样去看我妈的时候带东西就不用发愁了,而且去看你妈的时候还可以多带点东西回来……(水木社区 作者:temporalMaze)
  18.大学毕业后某日,偶看到N久没联系的同学在河对岸放马,我就嘲笑他说:“小样,都混成这样了!”结果他就跟偶吵起来。偶怒:“靠,有种你放马过来啊!”他也怒:“谁怕谁啊~有种你牵牛过来呀!”(天涯开心乐园 作者:活的不如狗)
  19.永远忘不了三年前考台大研究所的那天——考完第一科后我心情有点落寞,突然一位仁兄大喊:“今年的题太简单了!跟期末考的都一样,看来今年得250分以上才能被录取喔~”听完我当即坐车回家。后来我去当兵——(天涯社区开心乐园图形防伪)(水木社区)
  20.上小学的时候,有一块块肌肉、会打架的是牛*B的,我是傻*B的;
  上中学的时候,会踢球、有女生暗恋的是牛*B的,我是傻*B的;
  上大学的时候,学习成绩好、个高人帅的是牛*B的,我是傻*B的;
  参加工作以后,有家庭背景、北京户口的是牛*B的,我是傻*B的;
  转眼谈婚论嫁,有车有房、存折后边零多的是牛*B的,我还是傻*B的;
  这才发现斗转星移,沧海桑田,牛*B的定义一直在变,而我却一直是傻*B的……(水木社区)
21.割下JJ敬神——既疼了自己,又得罪了神~(天涯宁夏 作者:梦回大漠)
  22.我把棉裤那么一脱,春姑娘就轻盈地来了~(水木社区 作者:chunhui)
  23.以后我就告诉我儿子:钱就是你亲爹!(天涯娱乐八卦)
  24.再牛*B的肖邦,也弹不出老子的悲伤!(天地人大)
  25.孩儿他娘,咱这辈子还有很多事要做呢,别耽误功夫和我玩捉迷藏了,赶紧蹦出来吧~(水木社区 作者:akaven)
  26.连贝克汉姆都不知道,你丫还有什么资格敢跟我谈篮球!(天涯娱乐八卦 作者:小马王1986)
  27.男人与牙刷——我绝不与人共用!(天涯广州 作者:毛线拓拓)
  28.我是从地狱来接引你们的,见到撒旦麻烦告诉他说一声——是俺给他地狱添牲口的~(天涯灌水专区 作者:walorry)
  29.今天朕要临幸谁——春春,芙蓉,许纯美?(天涯娱乐八卦 作者:dono)
  30.万能的主啊,你若还有几分仁慈,便在偶生日那天让一个手持皮鞭的女王送23根滴油的蜡烛来吧~~~(水木社区 作者:Pote)
  31.女人一生喜欢两朵花:一是有钱花,二是尽量花!(天涯广州 作者:黑道辣椒)
  32.我很崇拜自己——通过Google找到一个分手12年的女友!(饮水思源)
  33.没有女人的日子里,我以调戏男人为乐~(饮水思源)
  34.女人是制造人类的工具,男人是使用工具的人类!(天涯灌水专区 作者:LXU0209)
  35.女人就像书架上的书,虽然你买了她,但在你买之前她多多少少会被几个男人翻过……(郁金香)
  36.女生如何装清纯?说话时把所有的“我”字都换成“人家”,就这么简单~(饮水思源)
  37.妹特思棒威——不走寻常路!(兵马俑 作者:renwoxing)
  38.“一炮走红”,其实是形容女艺人的……(水木社区 作者:adding)
  39.假如给女孩一个安全的环境,她能淫荡得让你流鼻血流到死!(紫丁香 作者:duizhang)
  40.一个女人:她可以喜欢你,但她不爱你;她可以爱你,但她不嫁你;她可以嫁你,但她不生育;她可以生育,但孩子不是你的……(水木社区 作者:freedmind)
  41.主持人采访一对双胞胎,问其中一个:“你几岁啦?”对方回答,然后主持人转过去又问另一个:“你呢?”(水木社区)
  42.还是这家公司好——薪得付信息技术(上海)有限公司,连名字起得都这么让人放心~(饮水思源 作者:XiaPu)
  43.一美国人到中国旅游,归来后感慨:“社会主义真是好啊!在中国,连狗都穿名牌!”(天涯娱乐八卦 作者:wou_112)
  44.随着食堂再次悄无声息的涨价,科大又向培养二十一世纪不健康人才的宏伟目标迈出了坚实的一步!(瀚海星云)
  45.今天是3.14,圆周率节,所以要吃派~(饮水思源)
  46.今天是植树节,咱也买点葱回家种!(天涯娱乐八卦 作者:轩缘英)
  47.女朋友漂亮能干嘛?(兵马俑 作者:lionet)
  48.某女的一篇博客日记:某月某日,大醉而归,伸手一摸——手机和贞操都在,睡觉!(两全其美)
  49.华为一员工在马蹄山嫖娼被公安抓获而成为公司年度丑闻,开除理由:去这么便宜的地方,让公司的颜面何在!(天涯杂谈 作者:当然不可不灌)
51.刻苦用功,逃离华工!(华南木棉 作者:ch_k_f)
  52.人大终于排在清华北大前面了——卖票大妈卖力地喊:“魏公村、人大、黄庄、北大、清华啦~抓紧时间上车喽!”(天涯开心乐园 作者:mace)
  53.不上咱学校的洋妞不知道自己是只小小鸟——怪不得赵传唱这首歌的时候那么伤心……(兵马俑 作者:canizares)
  54.师弟形容他宿舍的卫生情况——“回到宿舍,我都不想睁开眼!!!”(水木社区 作者:loveautumn)
  55.毕业后接一大活儿,完事后能挣三十万,拿图纸一看,盖一40米的烟囱。都盖好了,人家来一看把我狠揍一通!我靠,图纸看倒了,人家是让挖口井……(水木社区 作者:waitinger)
  56.做人不能太芙蓉,否则容易首尔,严重了还会陈凯歌!(水木社区 作者:SHENOK)
  57.高中时,班主任常开导我说:“美女多如过江之鲫,你现在只需好好织网!”考上清华后我想拿猴皮筋弹他家玻璃……(水木社区 作者:iamccp)
  58.学校有个跆拳道班,每到开班时,我就发现学校的白带增多了……(天涯开心乐园 作者:无胆无色)
  59.小时候,她父母始终相信女大十八变,丑小鸭会变白天鹅!长大后的某天,爸爸很专注地看着她,然后语重心长地说:“孩子,你还是用功读书吧……”(天大求实 作者:xinlingmima)
  60.3月14号出考研成绩,信佛的请为我烧香,信主的请为我祈祷,信真主的请为我真的祈祷,信共产主义的请高歌一曲《红军不怕远征难》,信自由主义的请挑灯夜读一篇王小波,信民族主义的请朗诵一遍《满江红》,信个体主义的请脱了衣服到你家门口裸奔,啥都不信的,要不,替我给复旦招生委员会的老头子们送点cash?(日月光华)
  61.男人口袋有点钱,腰部以下不会闲!(天涯开心乐园)
  62.生的伟大,死在花下!(天涯四川 作者:蠲)
  63.肉的理想,白菜的命!(天涯开心乐园 干天动地)
  64.不是我不笑,一笑粉就掉!(天涯开心乐园)
  65.降敌一个,自损三亿……(隐讳,水木社区 作者:yanting)
  66.一分一分,省到结婚。(天涯广州 作者:99锉人)
  67.宁和明白人打一架,不跟SB说句话!(天涯娱乐八卦 作者:开着大奔偷大蒜)
  68.逼是一样的逼,脸蛋分高低!(天涯娱乐八卦 作者:不败猪猪)
  69.大女人不可一日无权,小女人不可一日无钱!(天涯娱乐八卦作者:michelle-520)
  70.想当年,携女友每日杀人数十亿,爽哉;叹如今,唯靠左右手协同作案,悲哉!(天涯开心乐园 作者:笑望亭)

1 Comment

huawei最后一道小题

tree和forest的结构有些差别,tree包含data ,lchild ,rchild,而forest则是data,firstchild nextsibling;
 
 
typedef struct tnode{
        char tdata;
        struct tnode *lchild,*rchild;
        }tnode,*tree;
typedef struct fnode{
        char fdata;
        struct fnode *firstchild,*nextsibling;
        }fnode,*forest;
void foresttotree(forest a,tree b){
     if(a){
           if(!(b=(tnode *)malloc(sizeof(tnode))))
           exit(0);
           b->tdata=a->fdata;
           foresttotree(a->firstchild,b->lchild);
           foresttotree(a->nextsibling,b->rchild);
           }
           }
 
当时我写的用的也是递归,不过struct那里没有定义好,sb了,这段代码我看着好像有问题,看客望请指点,算是抛砖引玉。。。

Leave a comment

zz

作者:比目鱼 创作于2007-03-31 04:57 ,发表于2007-04-1
(比目鱼博客:http://www.bimuyu.com/blog/
2007年4月1日最新发布名人广告代言,包括代言品牌,广告词。
1.重庆“最牛钉子户”夫妇代言“虎头牌钉子”。
广告词:(手举一颗钉子)除了锤子,不向任何人低头!
2.刘德华女粉丝杨丽娟代言“松花江牌粉丝”。
广告词:粉丝就应该这样:好痴(吃)!好痴(吃)!
3.王朔代言“花鼎牌炊具”。
广告词:(手持一把炒勺)有人说我天天炒,其实全靠工具好!
4.宋丹丹代言“象牌火柴”。
广告词:(东北口音)你太有柴了!
5.黄健翔代言北京市大兴县养猪场。
广告词:(站在猪圈前,吼叫)你不是一个人!!(停顿片刻)你是一只猪!!
6.湖南卫视“快乐男生”参赛选手集体代言“湖南第六妇产科医院”。
广告词:很快乐,不难生!

Leave a comment

linus写的,貌似

/*  
   2     *     linux/lib/string.c  
   3     *  
   4     *     Copyright   (C)   1991,   1992     Linus   Torvalds  
   5     */  
   6    
   7   /*  
   8     *   stupid   library   routines..   The   optimized   versions   should   generally   be   found  
   9     *   as   inline   code   in   <asm-xx/string.h>  
   10     *  
   11     *   These   are   buggy   as   well..  
   12     */  
   13      
   14   #include   <linux/types.h>  
   15    
   16   char   *   ___strtok   =   NULL;  
   17    
   18   char   *   strcpy(char   *   dest,const   char   *src)  
   19   {  
   20                   char   *tmp   =   dest;  
   21    
   22                   while   ((*dest++   =   *src++)   !=   ”)  
   23                                   /*   nothing   */;  
   24                   return   tmp;  
   25   }  
   26    
   27   char   *   strncpy(char   *   dest,const   char   *src,size_t   count)  
   28   {  
   29                   char   *tmp   =   dest;  
   30    
   31                   while   (count–   &&   (*dest++   =   *src++)   !=   ”)  
   32                                   /*   nothing   */;  
   33    
   34                   return   tmp;  
   35   }  
   36    
   37   char   *   strcat(char   *   dest,   const   char   *   src)  
   38   {  
   39                   char   *tmp   =   dest;  
   40    
   41                   while   (*dest)  
   42                                   dest++;  
   43                   while   ((*dest++   =   *src++)   !=   ”)  
   44                                   ;  
   45    
   46                   return   tmp;  
   47   }  
   48    
   49   char   *   strncat(char   *dest,   const   char   *src,   size_t   count)  
   50   {  
   51                   char   *tmp   =   dest;  
   52    
   53                   if   (count)   {  
   54                                   while   (*dest)  
   55                                                   dest++;  
   56                                   while   ((*dest++   =   *src++))   {  
   57                                                   if   (–count   ==   0)  
   58                                                                   break;  
   59                                   }  
   60                   }  
   61    
   62                   return   tmp;  
   63   }  
   64    
   65   int   strcmp(const   char   *   cs,const   char   *   ct)  
   66   {  
   67                   register   signed   char   __res;  
   68    
   69                   while   (1)   {  
   70                                   if   ((__res   =   *cs   –   *ct++)   !=   0   ||   !*cs++)  
   71                                                   break;  
   72                   }  
   73    
   74                   return   __res;  
   75   }  
   76    
   77   int   strncmp(const   char   *   cs,const   char   *   ct,size_t   count)  
   78   {  
   79                   register   signed   char   __res   =   0;  
   80    
   81                   while   (count)   {  
   82                                   if   ((__res   =   *cs   –   *ct++)   !=   0   ||   !*cs++)  
   83                                                   break;  
   84                                   count–;  
   85                   }  
   86    
   87                   return   __res;  
   88   }  
   89    
   90   char   *   strchr(const   char   *   s,char   c)  
   91   {  
   92                   for(;   *s   !=   c;   ++s)  
   93                                   if   (*s   ==   ”)  
   94                                                   return   NULL;  
   95                   return   (char   *)   s;  
   96   }  
   97    
   98   size_t   strlen(const   char   *   s)  
   99   {  
   100                   const   char   *sc;  
   101    
   102                   for   (sc   =   s;   *sc   !=   ”;   ++sc)  
   103                                   /*   nothing   */;  
   104                   return   sc   –   s;  
   105   }  
   106    
   107   size_t   strnlen(const   char   *   s,   size_t   count)  
   108   {  
   109                   const   char   *sc;  
   110    
   111                   for   (sc   =   s;   *sc   !=   ”   &&   count–;   ++sc)  
   112                                   /*   nothing   */;  
   113                   return   sc   –   s;  
   114   }  
   115    
   116   size_t   strspn(const   char   *s,   const   char   *accept)  
   117   {  
   118                   const   char   *p;  
   119                   const   char   *a;  
   120                   size_t   count   =   0;  
   121    
   122                   for   (p   =   s;   *p   !=   ”;   ++p)   {  
   123                                   for   (a   =   accept;   *a   !=   ”;   ++a)   {  
   124                                                   if   (*p   ==   *a)  
   125                                                                   break;  
   126                                   }  
   127                                   if   (*a   ==   ”)  
   128                                                   return   count;  
   129                                   ++count;  
   130                   }  
   131    
   132                   return   count;  
   133   }  
   134    
   135   char   *   strpbrk(const   char   *   cs,const   char   *   ct)  
   136   {  
   137                   const   char   *sc1,*sc2;  
   138    
   139                   for(   sc1   =   cs;   *sc1   !=   ”;   ++sc1)   {  
   140                                   for(   sc2   =   ct;   *sc2   !=   ”;   ++sc2)   {  
   141                                                   if   (*sc1   ==   *sc2)  
   142                                                                   return   (char   *)   sc1;  
   143                                   }  
   144                   }  
   145                   return   NULL;  
   146   }  
   147    
   148   char   *   strtok(char   *   s,const   char   *   ct)  
   149   {  
   150                   char   *sbegin,   *send;  
   151    
   152                   sbegin     =   s   ?   s   :   ___strtok;  
   153                   if   (!sbegin)   {  
   154                                   return   NULL;  
   155                   }  
   156                   sbegin   +=   strspn(sbegin,ct);  
   157                   if   (*sbegin   ==   ”)   {  
   158                                   ___strtok   =   NULL;  
   159                                   return(   NULL   );  
   160                   }  
   161                   send   =   strpbrk(   sbegin,   ct);  
   162                   if   (send   &&   *send   !=   ”)  
   163                                   *send++   =   ”;  
   164                   ___strtok   =   send;  
   165                   return   (sbegin);  
   166   }  
   167    
   168   void   *   memset(void   *   s,char   c,size_t   count)  
   169   {  
   170                   char   *xs   =   (char   *)   s;  
   171    
   172                   while   (count–)  
   173                                   *xs++   =   c;  
   174    
   175                   return   s;  
   176   }  
   177    
   178   char   *   bcopy(const   char   *   src,   char   *   dest,   int   count)  
   179   {  
   180                   char   *tmp   =   dest;  
   181    
   182                   while   (count–)  
   183                                   *tmp++   =   *src++;  
   184    
   185                   return   dest;  
   186   }  
   187    
   188   void   *   memcpy(void   *   dest,const   void   *src,size_t   count)  
   189   {  
   190                   char   *tmp   =   (char   *)   dest,   *s   =   (char   *)   src;  
   191    
   192                   while   (count–)  
   193                                   *tmp++   =   *s++;  
   194    
   195                   return   dest;  
   196   }  
   197    
   198   void   *   memmove(void   *   dest,const   void   *src,size_t   count)  
   199   {  
   200                   char   *tmp,   *s;  
   201    
   202                   if   (dest   <=   src)   {  
   203                                   tmp   =   (char   *)   dest;  
   204                                   s   =   (char   *)   src;  
   205                                   while   (count–)  
   206                                                   *tmp++   =   *s++;  
   207                                   }  
   208                   else   {  
   209                                   tmp   =   (char   *)   dest   +   count;  
   210                                   s   =   (char   *)   src   +   count;  
   211                                   while   (count–)  
   212                                                   *–tmp   =   *–s;  
   213                                   }  
   214    
   215                   return   dest;  
   216   }  
   217    
   218   int   memcmp(const   void   *   cs,const   void   *   ct,size_t   count)  
   219   {  
   220                   const   unsigned   char   *su1,   *su2;  
   221                   signed   char   res   =   0;  
   222    
   223                   for(   su1   =   cs,   su2   =   ct;   0   <   count;   ++su1,   ++su2,   count–)  
   224                                   if   ((res   =   *su1   –   *su2)   !=   0)  
   225                                                   break;  
   226                   return   res;  
   227   }  
   228    
   229   /*  
   230     *   find   the   first   occurrence   of   byte   ‘c’,   or   1   past   the   area   if   none  
   231     */  
   232   void   *   memscan(void   *   addr,   unsigned   char   c,   size_t   size)  
   233   {  
   234                   unsigned   char   *   p   =   (unsigned   char   *)   addr;  
   235    
   236                   while   (size)   {  
   237                                   if   (*p   ==   c)  
   238                                                   return   (void   *)   p;  
   239                                   p++;  
   240                                   size–;  
   241                   }  
   242                   return   (void   *)   p;  
   243   } 

Leave a comment

memcpy()&memmove()

void * __cdecl memcpy (
        void * dst,
        const void * src,
        size_t count
        )

{
        void * ret = dst;
        /*
         * copy from lower addresses to higher addresses
         */
        while (count–) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
        }
        return(ret);
}

void * __cdecl memmove (
        void * dst,
        const void * src,
        size_t count
        )
{
        void * ret = dst;
        if (dst <= src || (char *)dst >= ((char *)src + count)) {
                /*
                 * Non-Overlapping Buffers
                 * copy from lower addresses to higher addresses
                 */
                while (count–) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
                }
        }
        else {
                /*
                 * Overlapping Buffers
                 * copy from higher addresses to lower addresses
                 */
                dst = (char *)dst + count – 1;
                src = (char *)src + count – 1;
 
                while (count–) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst – 1;
                        src = (char *)src – 1;
                }
        }
 
        return(ret);
}

今天huawei一个小题,如下:

char *str1="this is a string";

char *str2="this is a string";

memcpy(str1+4,str1,6);

memmove(str2+4,str2,6);

printf("%sn",str1);

printf("%sn",str2);

这段程序在现在的编译器比如dev-c++上compile会报错,就是因为在我以前写的潜规则中提到的char *定义赋值字符串问题,这种写法已经被淘汰了,因为char *现在一般用于定义指针而无内部类型,这里最好用char [20];

然后在tc2上编译了一下,发现自己sb了。。。

结果如下:

thisthisthstring

thisthis istring

不过在dev-c++上面将*改为[]后,发现结果如下

thisthis istring
thisthis istring

主要的问题就是Overlap(内存重叠),上面的CRT代码已经写出来了memcpy和memmove的区别,memcpy是memmove的子集,memmove可以对于重叠的内存操作进行逆序处理。。。memcpy对于重叠的copy会出现非所期望的结果,在copy的同时改变了src的内容,所以对于src,我们强调一定要const。。。根据上述结果可以猜测tc2里面的memcpy和memmove没有强调src的const,而现在的CRT应该是上面所ctrl+v的

对于旧的c标准,我是sb,同时,对于新的标准,这道题sb,以上。

1 Comment

volatile(zz from csdn)

如果你懂一点点的编译器的知识我想你都会知道编译器在编译你的代码的时候,用进行自动优化的,用以产生优化指令。同上操作系统和一些线程同样也会对你所定义的一些变量做出一些你所不知道的更改。这样的更改我们称为,隐式修改,因为你不知道,编译器在什么情况下,在那里做出了优化,甚至你都不知道,或是不能肯定编译器到底有没有对你的代码做出优化。
直接点把你看看下面的例子
 
#include <iostream>
void main()
{
int i=10;
int a = i;
printf("i= %dn",a);
__asm {
mov dword ptr [ebp-4], 50h
}
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道,来隐式的修改了变量。
int b = i;
printf("i= %dn",b);
}
然后,在调试版本(debug)模式运行程序,输出结果如下:
i = 10
i = 80
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
呵呵结果看到了吗?输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。所以得出一个结论在VC中release模式编译代码时编译器会自动对你的代码来做起优化的。而调试版本(debug)模式下便不会。
废话说了好多啊呵呵 下面继续说说 volatile
下面,我们把 i的声明加上volatile关键字,看看有什么效果:
 
#include <iostream>
void main()
{
 volatile int i=10;
 int a = i;
 printf("i= %dn",a);
 __asm {
  mov         dword ptr [ebp-4], 50h
 }
 int b = i;
 printf("i= %dn",b);
}
这下你再在调试版本和release版本运行程序,看看输出结果是不是都是:
i = 10
i = 32
估计大家看到这里便会明白了,volatile 这个关键字最最主要的意思是做什么的了。
在MSDN中volatile是一个限定符,也称为keyword或描述符,"volatile 关键字指示字段可由操作系统、硬件或并发执行的线程在程序中进行修改。"
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
声明方式为  volatile declaration
备注
系统总是在 volatile 对象被请求的那一刻读取其当前值,即使上一条指令从同一对象请求值。而且,该对象的值在赋值时立即写入。
volatile 修饰符通常用于由多个线程访问而不使用 lock 语句来序列化访问的字段。使用 volatile 修饰符能够确保一个线程检索由另一线程写入的最新值。
 
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

Leave a comment