打印

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

[复制链接]
楼主: ccjchen
手机看帖
扫描二维码
随时随地手机跟帖
21
原野之狼| | 2007-11-13 22:20 | 只看该作者 回帖奖励 |倒序浏览

考官的主要意图应该是这个:

两个指针的位置和拷贝有着很重要的关系。
也就是说指针的前后关系,及相差距离。

在有些情况下如果按照前几楼的朋友的操作方**造成源数据的破坏。

使用特权

评论回复
22
yewuyi| | 2007-11-14 08:51 | 只看该作者

呵呵,大家注意了吗?

数据长度是n,大小不确定,考试官而且强调了是n,哈哈,这长度也可能是1000万BYTE……



PIC这样结构是没有软件堆栈的,局部变量固定被分配在BANK0的RAM

使用特权

评论回复
23
embedvideo| | 2007-11-14 12:33 | 只看该作者

这样应该挑不出毛病了?

void _memmove(void * src, void * des, int n)
{
 unsigned char *s;
 unsigned char *t;
 assert(src!=NULL);
 assert(des!=NULL);
 if(n<=0 || des==src)return;

 if(des>src)
 {
  s = (unsigned char*)src+n-1;
  t = (unsigned char*)des+n-1;
  while(n--)*t-- = *s--;
 }else /* des<src */
 {
  s = (unsigned char*)src;
  t = (unsigned char*)des;
  while(n--)*t++ = *s++;
 }
}

全局变量放在数据段里(位置固定,程序加载时刻决定),局部变量放在堆栈里(位置随机,运行时刻决定),一般编译器好象都这样干.

使用特权

评论回复
24
eraychen| | 2007-11-14 13:03 | 只看该作者

顶19楼的

使用特权

评论回复
25
mohanwei| | 2007-11-15 17:30 | 只看该作者

不能全信教科书上说的那些……

对传入参数进行检查,理论上是很应该的……但是如果大家有兴趣打开linux或者glibc看看源码的实现,就会发现几乎没有注释而且代码“乱七八糟”……

程序的健壮性是靠系统工程来实现的……

使用特权

评论回复
26
tyrone3000| | 2007-11-15 20:33 | 只看该作者

ASSERT是什么?没用过哦

使用特权

评论回复
27
xplore| | 2007-11-16 13:14 | 只看该作者

从偶以前几个从华为出来的同事来看

华为人的整体素质还可以, 太差了是进不去。

不过也就如此而已。

使用特权

评论回复
28
现实主义| | 2007-11-16 13:32 | 只看该作者

搂主,面试软件,林锐的教程研究研究啊

搂主,面试软件,林锐的教程研究研究才好啊。

现在企业,用林博的这个考的少了,一段时间是很多企业招人标准题目。

不过,就是不考试,还是值得学习的,另外一个叫“0x10个问题”的小教材也不错.

使用特权

评论回复
29
xjg1111| | 2007-11-16 18:40 | 只看该作者

呀,扔了三年,看不懂了~~

使用特权

评论回复
30
ccjchen|  楼主 | 2007-11-16 20:06 | 只看该作者

其实我对软件不感兴趣

使用特权

评论回复
31
tangqin| | 2007-11-16 21:59 | 只看该作者

的确有很多问题;

/***************************************
******函数名称: dcopy()
******功能描述:100字节的数据块COPY;
******输    入:
******输    出:
******全局变量:
******调用函数:
******异常处理:
****************************************/

……

使用特权

评论回复
32
tangqin| | 2007-11-16 22:04 | 只看该作者

为什么我说应该这样解

因为你的程序如果没有完整的说明;没有标准的良好的书写格式,程序写的再精妙过几天也就无从考证了;在后续的排错过程中将陷入困境;
再说你的程序是你写的,用的人要看懂它。
如果你是系统分析员,那么你将面临更残酷的考验;文档的比例有可能3到5倍于程序代码;

使用特权

评论回复
33
C0mputerOO| | 2007-11-16 22:07 | 只看该作者

堆栈?

至少要区分出堆和栈来,虽然这是编译器给做好了的,但是也必须了解。因为这是软件最底层的东西。华为面试这个题经常出,天天出。

虽然对于单片机的编译器,会变成根本不是那么回事情,但是你还是要回答,没有办法,象PIC的CCSC编译器,根本就不是这么样分配的,因为PIC不支持堆栈访问。

使用特权

评论回复
34
idle911| | 2007-11-16 22:59 | 只看该作者

不知道对不对

这是从谭浩强的《C语言程序设计》中看到的:
内存中供用户使用的存储空间分三部分:

1.程序区2.静态存储区3.动态存储区

全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。静态局部变量也放在静态存储区。

动态存储区存放以下数据:
1)    函数形式参数;
2)    自动变量(未加static声明的局部变量);
3)    函数调用实的现场保护和返回地址;



使用特权

评论回复
35
gooog| | 2007-11-16 23:59 | 只看该作者

IC1008正解

使用特权

评论回复
36
cherrychip| | 2007-11-17 02:04 | 只看该作者

那你既然是搞硬件的就该反问这斯。。。

NAND FLASH 如何把N个字节从一个地址拷贝到另一个地址里去,没有任何底层函数支持,完全汇编。下面这个NAND FLASH测试板我做的,用了1K汇编

使用特权

评论回复
37
su_mj000| | 2007-11-17 02:07 | 只看该作者

19楼和20楼的组合才更好。即

void *memcpy (void *t, void *s,, unsinged int len)
{
    char *t1, *s1;
    t1 =(char *)t;
    s1 =(char *)s;
    
    while( len-- ) *t1++ = *s1++;
    return t1;
}

所谓的‘len < 0’是不存在的。

全局变量存放在公共数据区,各函数都能存取。而局部变量是否在堆栈上就难说啦。但有两点可以肯定:(1)局部变量的内容只有在本函数运行时才有效;(2)
编译器会设定本函数才能存取局部变量。还需补充的是,有些单片机的编译器会
让互不相关的函数共享一块RAM区,存放局部变量。

使用特权

评论回复
38
赤铸| | 2007-11-17 10:50 | 只看该作者

变量存放在哪儿是CPU和编译器的问题

没有统一答案,而且主要影响效率,有时还影响可重入。变量定义在哪儿,这才是程序是否可读可维护的关键。其实原则再简单不过:作用域越“局部”越好,能用局部变量或参数的,不要用全局变量

既然说“完整”的函数,注释、ASSERT还是必要的吧?

对于这个具体的函数,如果要功能完整,应该考虑两个内存块部分重叠的情况,这是简单拷贝会出错,因为人家说的是任意n个

使用特权

评论回复
39
dld2| | 2007-11-17 10:59 | 只看该作者

这个题目还是挺有内容的

使用特权

评论回复
40
现实主义| | 2007-11-17 12:03 | 只看该作者

还是看看林锐的答案吧

五、编写strcpy 函数( 10 分)
已知strcpy 函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。
(1)不调用C++/C 的字符串库函数,请编写函数 strcpy
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++) != ‘’ ) // 2分
NULL ;
return address ; // 2分
}
(2)strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了实现链式表达式。 // 2 分
例如 int length = strlen( strcpy( strDest, “hello world”) );

使用特权

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

本版积分规则