打印

google下林锐,高手编程指南,很短的几篇**

[复制链接]
楼主: ccjchen
手机看帖
扫描二维码
随时随地手机跟帖
41
ypj005| | 2007-11-17 21:26 | 只看该作者 回帖奖励 |倒序浏览

最好还是加上指针判断.

使用特权

评论回复
42
flanker| | 2007-11-17 21:55 | 只看该作者

窃以为:你被bs的原因

如果这个内存复制在关键业务路径里面,一个一个字节复制的确要被BS。
我们一般复制内存块都有对齐和非对齐的讲究;
如果对齐复制,那么不要用字节,用字(四字节)。
如果非对齐,则掐头去尾后再对齐。

HW的软件用他们自己弄的Dopra VOS操作系统,里面的内存复制函数就是一个一个字节复制的,关键路径里面用起来就很损失性能了。不过现在他们改了没有就不知道鸟:)
当然,一般地,关键业务路径不允许内存复制,呵呵

使用特权

评论回复
43
flanker| | 2007-11-17 21:57 | 只看该作者

顺便说一下,HW现在应该不用8位MCU,都用32位MIPS/PPC/x86的CPU

有个兄弟是HW过来的,他说HW都用PPC/MIPS/x86。
这些东西都是32位处理器。

唉,现在的MIPS已经都是64位的了,不过没准他们还没有用上……

使用特权

评论回复
44
xwj| | 2007-11-17 22:15 | 只看该作者

赞同43楼:一般地,关键业务路径不允许内存复制

越是关键的地方,越是要精打细算,仔细优化

使用特权

评论回复
45
古道热肠| | 2007-11-18 11:12 | 只看该作者

现实主义的答案很“现实”

    善于收集别人的成果,去伪存精,为我所用就不错。

林博的答案有几下几个优点:
1、运用了断言assert,假定"原串"与"目地串"均为不空的指针,是空指针则不存在复制的过程;
2、函数有指针型返回值,便于与标谁的ANSI的C环境String库函数兼容及前面网友提到的链式复用;
3、运用了转义字符“”,作为复制结束的判据,比较规范;
4、运用了Const关键字,对函数入口的指针进行了显式约束,防止对指针变量指向的内容作非预期的改变。

存在的不足:
1、函数的功能说明做得不好,尤其是入口参数与返回值的约定;
2、命名用简名,没有全名直观,比如宜用Copy 替代cpy,用Source代替src

使用特权

评论回复
46
wxj1952| | 2007-11-18 13:24 | 只看该作者

书上有标准答案

好想这么多人都没看过《C陷阱与缺陷》。说不定考官就是考考你看没看过一些最基本的参考书呢。

使用特权

评论回复
47
linqing171| | 2007-11-18 15:31 | 只看该作者

回 古道热肠,const另解。

实际中的单片机里面的C,没有几个标准的。
CCSC的存储器分配是比较个性的,所有的都是全局变量,然后根据函数的重入性再复用。 lst文件可以看的出来。

AVR单片机的指令和数据不是一个总线,所以再codevision AVR中把 const 给挪用成了flash。
const char * a; 是一个指向 flash char 类型的指针,此指针存于ram,而不是C++中的意思,这个变量的值不允许修改。
char * const a; 是一个存储于flash 的char 类型指针。

但是去考试,还是要说,局部变量在堆里,函数参数在栈里... ... 俨然都是X86架构下的C语言编译器的常规做法。

林锐也说自从经商以后就很少做技术了,但是现在来看,考的东西还都是他的书上的为多。 偶和林博士 是校友,同姓,当然没有他那个水平和那么高的学位。

但是华为的几年了考试就出这个strcpy,确实应该让人bs一下。


使用特权

评论回复
48
eleven11| | 2007-11-18 16:11 | 只看该作者

随便看看

好像只有22楼的同志说到点子上

使用特权

评论回复
49
kunliu| | 2007-11-18 18:53 | 只看该作者

这个问题问得不是很清楚

在PC机里,全局变量放静态存储区,局部变量放动态存储区
在TMS320CXXX中,全局变量放在你声明的段中,局部变量放在堆栈中
...

使用特权

评论回复
50
machunshui| | 2007-11-18 21:13 | 只看该作者

林的东西对出血者不错

林的东西对初学者不错.
没有大讲什么设计理论,就是平常编程时候,不注意的或者是没有关注到的点点滴滴.很好.
即使不是为了应付考试,也是完全值得一读的.

使用特权

评论回复
51
rainmans| | 2007-11-19 00:34 | 只看该作者

这个函数不是那么简单的

记得在哪本书上看过,写出来没有bug的还真不容易。
至少楼上3#,16#几位的都考虑的不全面。

使用特权

评论回复
52
onion2829| | 2007-11-19 00:46 | 只看该作者

标准答案

int memncpy(char *pcDes,const char *pcSrc, unsigned long ulLen)
{
    if((NULL==pcDes)||(NULL==pcSrc))
    {
        return 0;
    }
    while(ulLen--)
    {
        *pcDes++ = *pcSrc++;
    }
    return 1;
}

使用特权

评论回复
53
shura1206| | 2007-11-19 13:37 | 只看该作者

华为会考这么简单的问题?不信

使用特权

评论回复
54
taoyubai| | 2007-11-19 14:45 | 只看该作者

受教了,

学习学习,

使用特权

评论回复
55
imffs| | 2007-11-19 16:26 | 只看该作者

这个程序有个很值得注意的地方

如果dst+length区域和src+length区域有重合,这个时候
  while(len--)
  {
    *_d++ = *s++;
  }
这段程序就会出问题,如果src<dst即src地址在前,而src+length>dst,这个时候就会发现拷贝src的前面的数据其实是覆盖了src的后面部分的数据,这样就出问题了,所以在拷贝之前要判断src和dst的大小

使用特权

评论回复
56
dspjs| | 2007-11-19 17:28 | 只看该作者

hui

学习

使用特权

评论回复
57
wolver| | 2007-11-19 21:26 | 只看该作者

说得不好听点,出题的人是38

1)n的大小范围?
2)用的处理器或系统剩余ram?
3)“源”和“目的”指针在可读写区还是只读区?

你把这三问考他一下都不用写程序就可以过关了....

使用特权

评论回复
58
shishaojun| | 2007-11-20 01:45 | 只看该作者

应该这样的

晕倒
这个问题应该是这样的
1:考察你是否会C语言
   这个检查你是否会使用指针啊什么的。会这个只是基本合格
2:考察你有没有做参数检查   这点答对了你就说明你很优秀
   源指针  目的指针 长度  之间的关系很复杂。
   譬如源在0x00处 目标地址在0x04处,要拷贝10个字节。
   那么上面所有人写的代码都错了
因此函数最起码是:
    int MemCpy(BYTE *pSrc.BYTE *pDes,unsinged int Len){
         //参数合法性检查
         //如果目的地址大于源地址从后象前拷
         //如果源大于目的地址,从前向后拷贝
}
这道题华为和中兴都是要考的




}
   

使用特权

评论回复
59
qzx0580| | 2007-11-20 08:59 | 只看该作者

华为也不知道在搞什么

总是出一些火星题.

这个公司真的不好吗?

非常垃圾吗?

靠,我还面试了四轮呢.

如果不好咱就不去了.

使用特权

评论回复
60
change_p| | 2007-11-20 09:37 | 只看该作者

也写一个

uchar *_mencpy(uchar *s, uchar *d, uint n)
{
  uint i;
  for (i=0; i<n; i++)
  {
    *s = *d;
    s++;
    d++;
  }
  return s;
}

全局变量放在RAM的全局区, 局部变量放在RAM的栈区.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则