马鞍山律师事务所地址:百度_c语言吧_怎么提高c语言能力?请吧主及做过工程项目的指点!!

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 10:16:22

    快速回复   

1 怎么提高c语言能力?请吧主及做过工程项目的指点!! 本人毕业4年后由于工作关系从学C语言,最近用半个月的时间读完了一本《UNIX c程序设计》,并编译过书上的全部例题,和本吧里的“经典C源程序100例[精品]”下的例子,目前能达到这个水平:即C闲人 写的那篇C语言常见错误里,提到的常见错误本人都很少出现,出现了也会第一时间找出错误,不知道这样算不算入门了,但,困惑的是,怎么完成一个大一点的项目,头脑里是毫无概念!过完年后进开发组我们开发的是unix下的应用软件,不涉及图像和网路,请有经验的朋友指点一下,我还应在那方面下功夫,或看什么书对我的C语言能力提高有帮助,我不想一进开发组,就比别人差的太多,(我没任何编程语言的基础)!谢谢 作者: Stoplove  2005-1-30 11:03   回复此发言  
2 回复:怎么提高c语言能力?请吧主及做过工程项目的指点!! 我没有用C做过大项目,你还是等C闲人,assiss,akuma他们来说吧,

unix下,应该是用C本身的函数来实现所有功能了吧。
其实如果你对一些基本算法和数据结构了解一些的话,那你现在欠缺的应该是对函数的应用和熟悉了,即使用什么函数能完成你的思想。 作者: vc99  2005-1-30 11:20   回复此发言  
3 回复:怎么提高c语言能力?请吧主及做过工程项目的指点!! 谢谢VC99
C语言宝典里好像介绍了很多函数,了解一下先。
一个教授说,一个应用程序里非数值算法占了80%,非数值算法是什么?搜了一下,更糊涂了 作者: Stoplove  2005-1-30 11:39   回复此发言  
4 回复:怎么提高c语言能力?请吧主及做过工程项目的指点!! 数值算法----为数学问题形成的一个构造性解法的完备而确切的描述。 (数学运算) 
 
非数值算法----对信息(数据)的加工处理、转换、分类、查找、排序和存储等。 作者: vc99  2005-1-30 13:06   回复此发言  
5 希望对你有用 -------------------------- 熟练掌握 make --------------------
很多人学了 c, 却经常忽略了 make, 其实它的功能很强大。在做工程项目的时候,make 不仅可以用来自动编译大的项目,还可以让很多别的繁琐的工序自动化,在 Unix 下编程最好掌握它。
可以看看这个,简单的 make 介绍:http://www.cs.csubak.edu/HowToGuides/make_basics.html
这个一定要看: $man make

关于库函数,可用 man 来查, 要是有疑问的话,也可以来这里问。
这里有人介绍的 《C语言宝典》 大部分是关于 Turbo C 的,也不兼容最新的 c99 标准,对你没用。

-------------------------- 编码习惯 -------------------------
做项目一般有项目经理,这就好办多了,他会协调、分配大家的任务。
稍微有一定复杂程度的项目,千万不要把所有的代码放在同一文件里。建议把 main 函数高度抽象化,不要把实际操作代码放在 main,其它函数每一个(或同类的一组)放在自己的文件里。

如:
/* main.c */
#include "project.h"
int main(int argc, char *argv[])
{
 int res = 0;
 display_copyright(); /* 显示程序名,版权信息 */
 initialize(); /* 初始化 */
 parse_command_line(argc, argv); /* 处理命令行 */
 res = do_command(); /* 实现功能 */
 clean_up(); /* 清理,准备退出 */
 return res;
}

-------------------
如果你被分配到实现某一个模块。而在你的模块中几个函数要共享一个变量的话,不要把变量定义为全局的,可定义为 static 的。若是另一个模块要存/取这个变量,定义存取的接口函数。这样可避免你的内部数据被别人意外修该,这种 bug 很难查出来的。
如:

/*----------------------------------------------*
//* user.h */
/* 这是让别人引用你的模块是包含的头文件 */
/* 注意:这里没有定义 current_user,别人不需要也不应该知道它的存在 */
int get_user_id(void);
void set_id(const int new_id);
/* end of user.h */
/*----------------------------------------------*/


/*----------------------------------------------*/
/* user.c */
#include "user.h"
static struct user current_user;

int get_user_id(void)
{
 return current_user.id;
}

void set_id(const int new_id)
{
 current_user.id = new_id;
}

/* 还有其它的操作,略... */
/* end of user.c */
/*----------------------------------------------*/


---------------------------
一定要注释,你现在可能很清楚自己在干什么,可是你能保证一个月后也知道吗?三个月呢? 一年呢? 要是别人要维护你的代码呢?千万不要懒。


--------------------- 计划好才动手 ------------------------
最重要的是沟通,在动手之前,和项目经理、其它成员先充分讨论。
讨论、计划往往用的时间比实际写 code 还要多。一旦开始写了,在改就难了,也容易产生新的 bug。
M$ 就是一个典型的反面教材,哈哈。什么都要尽快出,好占取市场分额,结果呢,补丁加补丁,像是旧衣衫(当然还有所谓的 fashion 也是这样的,怀旧和潮流本来就不分家)。你能保证补丁就没有窟窿?补丁多了你穿上也不舒服。



先罗嗦到此,我打字很慢的,好不容易才混到这里...... 作者: akuma  2005-1-31 11:47   回复此发言  
6 回复:怎么提高c语言能力?请吧主及做过工程项目的指点!! 谢谢5楼的朋友
man居然还能查函数甚至是关键字,搞了这么久的UNIX今天才知道,惭愧

你的留言我搜藏了 ,以后多多向你学习 作者: Stoplove  2005-2-1 11:09   回复此发言  
7 回复:怎么提高c语言能力?请吧主及做过工程项目的指点!! 顶 作者: 218.88.106.*  2005-2-3 16:56   回复此发言  
8 回复:怎么提高c语言能力?请吧主及做过工程项目的指点!! 续...
------------------- 调试工具 ---------------------
在文本状态下还有两个好东西可以用,
void assert(x);

trace;

先说 assert;
头文件: 
#include 
void assert(x);
如果 x 的值为假(也就是等于零),assert 就会调用 abort(),终止程序运行。

c 里常用到指针,引用没初始化的指针常常引起程序崩溃,每次用 if 来测试又太烦,就可以用 assert。

如:
include 
#include 
/* 注意 1 */
/*#define NDEBUG
*/
#include 

void display_p(int *p)
{
/* 注意 2 */
    assert(p);
    /* This is better than use
       if (p) { ... }
       else ...
    */
    printf("address p points to is : %p\n", p);
    printf("value p points to is   : %d\n", *p); 
}

int main ()
{
    int a, b;
    int *pa, *pb, *pn = NULL;
    
    a = 10;
    b = 20;
    pa = &a;
    pb = &b;
    
    printf("a = %d, b = %d, pa = %p, pb = %, pn = %p\n", a, b, pa, pb, pn);
    
    display_p(pa);
    
    /* this call will cause assert to fail, then terminate the program */
    display_p(pn);
    
    /* so, this one will NEVER be call. */
    display_p(pb);
    
    return EXIT_SUCCESS;
}

你可能会说,在“注意 2”的地方干嘛不用 if 呢,多省事。
没错,用这个方法看起来是麻烦了,这就是为什么有了“注意 1”这一行。
试想想,非法指针调用,99%是程序员的错,成品后最终用户不可能传递一个空指针给你吧。
所以这个只在开发、测试有用,在成品中反而会影响速度。
assert 函数的设计是这样的,当你开发、测试是包含头文件 assert.h,
assert 就可以用了。当你调试完,编译成品是,在包含头文件 assert.h 之前定义一个叫 NDEBUG 的宏,就是把“注意 1”的注释去掉。assert 函数就会完全消失。鱼与熊掌,两者兼得,哈哈。 作者: akuma  2005-2-3 19:35   回复此发言  
9 回复:怎么提高c语言能力?请吧主及做过工程项目的指点!! trace
assert 是标准 c 函数,trace 却不是,可是几乎每一种 c 的实现里都定义了它,可想而知是多有用。
其实,只要明白了条件编译的原理,自己定做一个 trace 是更好的选择。

trace 的最主要用途是让你知道运行到哪了,所以一个最简单的 trace 可以是这样的:

#define trace printf("in file : %s, line : %u\n", __FILE__, __LINE__)

用起来可以这样:

...
    a = 10;
    trace; 
    b = 20;
...

为了不影响成品的速度,可以把 trace 这样定义:

#ifdef NDEBUG

#define trace

#else

#define trace printf("in file : %s, line : %u\n", __FILE__, __LINE__)

#endif

这样就和 assert 一样了,只要在定义 trace 之前把 NDEBUG 定义了,trace 就会什么都不做,甚至不会在生成的代码中出现。


你还可以这样定义 trace,这样它还可以像 printf 一样用:

#define trace(s) {\
nbsp;   printf("in file : %s, line : %u\n", __FILE__, __LINE__);\
nbsp;   printf((s));\
nbsp;   fflush(stdout);\
nbsp; }

这样就可以这样调用了:
...
    a = 10;
    trace("a = %d", a); 
    b = 20;
...