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

[复制链接]
ypj005 发表于 2007-11-17 21:26 | 显示全部楼层

最好还是加上指针判断.

flanker 发表于 2007-11-17 21:55 | 显示全部楼层

窃以为:你被bs的原因

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

HW的软件用他们自己弄的Dopra VOS操作系统,里面的内存复制函数就是一个一个字节复制的,关键路径里面用起来就很损失性能了。不过现在他们改了没有就不知道鸟:)
当然,一般地,关键业务路径不允许内存复制,呵呵
flanker 发表于 2007-11-17 21:57 | 显示全部楼层

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

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

唉,现在的MIPS已经都是64位的了,不过没准他们还没有用上……
xwj 发表于 2007-11-17 22:15 | 显示全部楼层

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

越是关键的地方,越是要精打细算,仔细优化
古道热肠 发表于 2007-11-18 11:12 | 显示全部楼层

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

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

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

存在的不足:
1、函数的功能说明做得不好,尤其是入口参数与返回值的约定;
2、命名用简名,没有全名直观,比如宜用Copy 替代cpy,用Source代替src
wxj1952 发表于 2007-11-18 13:24 | 显示全部楼层

书上有标准答案

好想这么多人都没看过《C陷阱与缺陷》。说不定考官就是考考你看没看过一些最基本的参考书呢。
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一下。


eleven11 发表于 2007-11-18 16:11 | 显示全部楼层

随便看看

好像只有22楼的同志说到点子上
kunliu 发表于 2007-11-18 18:53 | 显示全部楼层

这个问题问得不是很清楚

在PC机里,全局变量放静态存储区,局部变量放动态存储区
在TMS320CXXX中,全局变量放在你声明的段中,局部变量放在堆栈中
...
machunshui 发表于 2007-11-18 21:13 | 显示全部楼层

林的东西对出血者不错

林的东西对初学者不错.
没有大讲什么设计理论,就是平常编程时候,不注意的或者是没有关注到的点点滴滴.很好.
即使不是为了应付考试,也是完全值得一读的.
rainmans 发表于 2007-11-19 00:34 | 显示全部楼层

这个函数不是那么简单的

记得在哪本书上看过,写出来没有bug的还真不容易。
至少楼上3#,16#几位的都考虑的不全面。
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;
}
shura1206 发表于 2007-11-19 13:37 | 显示全部楼层

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

taoyubai 发表于 2007-11-19 14:45 | 显示全部楼层

受教了,

学习学习,
imffs 发表于 2007-11-19 16:26 | 显示全部楼层

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

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

hui

学习
wolver 发表于 2007-11-19 21:26 | 显示全部楼层

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

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

你把这三问考他一下都不用写程序就可以过关了....
shishaojun 发表于 2007-11-20 01:45 | 显示全部楼层

应该这样的

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




}
   
qzx0580 发表于 2007-11-20 08:59 | 显示全部楼层

华为也不知道在搞什么

总是出一些火星题.

这个公司真的不好吗?

非常垃圾吗?

靠,我还面试了四轮呢.

如果不好咱就不去了.

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的栈区.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部