I am doing some tests about a language。Before doing this project I did some programs and thought there is nothing in testing.Now I don't think so,to find one bug and solve this bug you must do much investigation and know the theory.By way I can feel the skills of designing the language. Whatever you do you must pay your attention to the basics and spirits of objects.We must be patient and like to study,our major changes very quickly if you don't have such attitudes,you will be the next loser.
发布评论
评论(8)
好的编程习惯也是提高软件质量的重要因素,还记得曾经为了找出 if (i = 1)这样的问题花了那么多的时间,如果早点看看《高质量C编程》就好了。
觉得具体的语言都是比较虚的,特别是解释性的语言,几乎都是从编译型的发展来的。
如果有C/C++语言之类的基础,对于特定的语言学习不会很难。
学习一门新的语言,最重要的就是阅读别人写的代码。(当然最好是看成熟的代码)
还有就是了解程序的执行过程(不是main那种),而是上面提到的链接,上下文等。
这样才能提高的更快
I am doing some tests about a language。Before doing this project I did some programs and thought there is nothing in testing.Now I don't think so,to find one bug and solve this bug
you must do much investigation and know the theory.By way I can feel the skills of designing the language. Whatever you do you must pay your attention to the basics and spirits of objects.We must be patient and like to study,our major changes very quickly if you don't have such attitudes,you will be the next loser.
楼主见解很精辟!
我做硬件的,C语言学的很一般。也没有写过大程序。看内核的时候碰见下面的语句,
#define likely(x) b_expect(!!(x), 1)
#define unlikely(x) b_expect(!!(x), 0)
#define b_expect(x, expected_value) (x)
实在揣摩不透作者的用意,加上脑袋瓜不好使,很多东西都忘记了。所以就编了下面这个来测试:
#include <stdio.h>
#define likely(x) b_expect(!!(x), 1)
#define unlikely(x) b_expect(!!(x), 0)
#define b_expect(x, expected_value) (x)
void main(void)
{
int i,x;
for(i=0;;i++)
{
printf("Test likely,unlikely,Pls Input x:");
scanf("%d",&x);
printf("n");
printf("likely(%d) is:%dn",x,likely(x));
printf("unlikely(%d) is :%dn",x,unlikely(x));
}
}
呵呵,一句话,我的程序都是测试出来的。
[ 本帖最后由 iolinux 于 2006-8-7 21:31 编辑 ]
用cscope定位结构体等三步曲:
1.用绝对路径的好处是生成的cscope.out可以放在任意位置使用。
复制代码
2.
复制代码
3.在vim(要编译cscope功能)中使用
复制代码
即可用ctrl+鼠标左键或ctrl+]来定位该结构体的定义之处。
由于ctrl+]默认按:cs find g word的功能,有些时候还需要用:cs find s word,可以
复制代码
复制代码
今天看到er的帖子,想起来了.做个标记.
又google到一篇文章
出处
http://linux.chinaitlab.com/kernel/37973.html
在链接过程中,链接器ld和ld86会使用变量记录下执行程序中每个段的逻辑地址。因此在程序中可以通过访问这几个外部变量来获得程序中段的位置。链接器预定义的外部变量通常至少有etext、_etext、edata、_edata、end和_end。
变量名_etext和etext的地址是程序正文段结束后的第1个地址;_edata和edata的地址是初始化数据区后面的第1个地址;_end和end的地址是未初始化数据区(bss)后的第1个地址位置。带下划线'_'前缀的名称等同于不带下划线的对应名称,它们之间的唯一区别在于ANSI、POSIX等标准中没有定义符号etext、edata和end。
当程序刚开始执行时,其brk所指位置与_end处于相同位置。但是系统调用sys_brk()、内存分配函数malloc()以及标准输入/输出等操作会改变这个位置。因此程序当前的brk位置需要使用sbrk()来取得。注意,这些变量名必须看作是地址。因此在访问它们时需要使用取地址前缀'&',例如&end等。例如:
extern int _etext;
int et;
(int *) et = &_etext; // 此时et含有正文段结束处后面的地址。
下面程序predef.c可用于显示出这几个变量的地址。可以看出带与不带下划线'_'符号的地址值是相同的。
/*
Print the symbols predefined by linker.
*/
extern int end, etext, edata;
extern int _etext, _edata, _end;
int main()
{
printf("&etext=%p, &edata=%p, &end=%pn",
&etext, &edata, &end);
printf("&_etext=%p, &_edata=%p, &_end=%pn",
&_etext, &_edata, &_end);
return 0;
}
在Linux 0.1X系统下运行该程序可以得到以下结果。请注意,这些地址都是程序地址空间中的逻辑地址,即从执行程序被加载到内存位置开始算起的地址。
[/usr/root]# gcc -o predef predef.c
[/usr/root]# ./predef
&etext=4000, &edata=44c0, &end=48d8
&_etext=4000, &_edata=44c0, &_end=48d8
[/usr/root]#
如果在现在的Linux系统(例如RedHat 9)中运行这个程序,就可得到以下结果。我们知道现在Linux系统中程序代码从其逻辑地址0x08048000处开始存放,因此可知这个程序的代码段长度是0x41b字节。
[root@plinux]# ./predef
&etext=0x804841b, &edata=0x80495a8, &end=0x80495ac
&_etext=0x804841b, &_edata=0x80495a8, &_end=0x80495ac
[root@plinux]#
Linux 0.1x内核在初始化块设备高速缓冲区时(fs/buffer.c),就使用了变量名_end来获取内核映像文件Image在内存中的末端后的位置,并从这个位置起开始设置高速缓冲区。
复制代码
[ 本帖最后由 mq110 于 2006-7-8 13:15 编辑 ]
十年学会编程
编程涉及到的面实在太广/
不仅是编程的思想,对于代码,你要理解到你的程序如何在计算机上运行,如何在内存中分配,在CPU上的优先级,等等.
作为一个优秀的程序员,不仅是是上层的代码,对于底层的硬件也应该很了解.精通.