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

[复制链接]
21478|77
原野之狼 发表于 2007-11-13 22:20 | 显示全部楼层

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

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

在有些情况下如果按照前几楼的朋友的操作方**造成源数据的破坏。
yewuyi 发表于 2007-11-14 08:51 | 显示全部楼层

呵呵,大家注意了吗?

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



PIC这样结构是没有软件堆栈的,局部变量固定被分配在BANK0的RAM
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++;
 }
}

全局变量放在数据段里(位置固定,程序加载时刻决定),局部变量放在堆栈里(位置随机,运行时刻决定),一般编译器好象都这样干.
eraychen 发表于 2007-11-14 13:03 | 显示全部楼层

顶19楼的

mohanwei 发表于 2007-11-15 17:30 | 显示全部楼层

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

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

程序的健壮性是靠系统工程来实现的……
tyrone3000 发表于 2007-11-15 20:33 | 显示全部楼层

ASSERT是什么?没用过哦

xplore 发表于 2007-11-16 13:14 | 显示全部楼层

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

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

不过也就如此而已。
现实主义 发表于 2007-11-16 13:32 | 显示全部楼层

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

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

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

不过,就是不考试,还是值得学习的,另外一个叫“0x10个问题”的小教材也不错.
xjg1111 发表于 2007-11-16 18:40 | 显示全部楼层

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

 楼主| ccjchen 发表于 2007-11-16 20:06 | 显示全部楼层

其实我对软件不感兴趣

tangqin 发表于 2007-11-16 21:59 | 显示全部楼层

的确有很多问题;

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

……
tangqin 发表于 2007-11-16 22:04 | 显示全部楼层

为什么我说应该这样解

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

堆栈?

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

虽然对于单片机的编译器,会变成根本不是那么回事情,但是你还是要回答,没有办法,象PIC的CCSC编译器,根本就不是这么样分配的,因为PIC不支持堆栈访问。
idle911 发表于 2007-11-16 22:59 | 显示全部楼层

不知道对不对

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

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

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

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



gooog 发表于 2007-11-16 23:59 | 显示全部楼层

IC1008正解

cherrychip 发表于 2007-11-17 02:04 | 显示全部楼层

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

NAND FLASH 如何把N个字节从一个地址拷贝到另一个地址里去,没有任何底层函数支持,完全汇编。下面这个NAND FLASH测试板我做的,用了1K汇编
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区,存放局部变量。
赤铸 发表于 2007-11-17 10:50 | 显示全部楼层

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

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

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

对于这个具体的函数,如果要功能完整,应该考虑两个内存块部分重叠的情况,这是简单拷贝会出错,因为人家说的是任意n个
dld2 发表于 2007-11-17 10:59 | 显示全部楼层

这个题目还是挺有内容的

现实主义 发表于 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”) );
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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