📄 00000004.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER> <BR> <BR> 战 斗 世 家 C 语言讲座 #4 <BR> <BR> 作者: Lgw Lu <BR> E-Mail: <A HREF="mailto:lgwlu@ms1.hinet.net">lgwlu@ms1.hinet.net</A> <BR>--------------------------------------------------------------- <BR> <BR> < 死角 - 不定参数 > <BR> <BR>前言: <BR> <BR> C 语言有很多功能,但有些功能很可能因为不常用,So 慢慢被人遗 <BR> 忘。本篇介绍就是常不被人注意的 不定参数!! <BR> <BR>内文: <BR> 相信大家都用过 printf 这个函数,这就是利用不定参数,来达到 <BR> 参数项目不固定的目的。 <BR> <BR> 但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI <BR> C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支援的标准;常在 <BR> 网路上看到有人推荐 K&R The C Programming Language 这本书,老 <BR> 实说这本是不错(我以前也是看这本),但因为 K&R C 慢慢因为 ANSI <BR> C 的完整标准出现,而面临考验,所以我建议若是初学者先从 ANSI C <BR> 看起,等对 ANSI C 的标准了解後,再回头看这本(其实不看也没差,虽 <BR> 然它号称 C 语言圣经,但时代在变,有些东东开始不适用。不过还是有 <BR> 看的价值) <BR> <BR> // 宣告 <BR> <BR> |- > ANSI C 不定参数宣告方式 <BR> int FUNC(int,...) <BR> ^^^ <BR> 固定的参数一定要放前面!! <BR> <BR> // 副程式部份 <BR> <BR> int FUNC(int xx,...) <BR> { <BR> int tmp; <BR> va_list arg_ptr; // 指向引数列表的 Pointer <BR> <BR> va_start(arg_ptr,xx); // 从引数表中取得第一个引数 <BR> // 第一个引数就是 xx 自己 <BR> <BR> tmp=va_arg(arg_ptr,int); // 从引数表中取得int 型态引数 <BR> // 一直呼叫 va_arg 即可取得所 <BR> // 有引数 <BR> <BR> va_end(arg_ptr); // 取完後将 arg_ptr = NULL <BR> // 以便归还 stack 空间 <BR> <BR> } <BR> <BR> 理论上不定参数是可以无限多的,但碍於 memory 及 stack 大小 <BR> 所以项数通常有上限,如 Turbo C 最多 200 个,一超过就出现如下 <BR> " Fatal stack overflow error-System halted ",然後当掉,你连 <BR> 暖开机都不行;所以当你使用一套 Compiler 时一定要有其参考手册 <BR> 或资料,以免搞半天除错後,还找不出原因!! <BR> (P.S. 像 Turbo C 2.0 只能用 4000 个 if ,....太多要注意的!!) <BR> <BR> 说了一堆,不知道你会用了没?! 最後用一个画多边型的函数做□ <BR> 例,顺便做结束。 <BR> <BR> /* EX */ <BR> #include <stdarg.h> // 记得要 include 才能用 <BR> #define END_P -400 // 用来判断是否为最後一个参数 <BR> <BR> void DrawPoly(int color,...) <BR> { <BR> va_list arg_ptr; <BR> int x[200],y[200]; // 最多 200 个点 <BR> int p_c=0; // 计算有几点 <BR> int i; // 计数器 <BR> <BR> va_list(arg_ptr,color); <BR> <BR> while(((x[p_c]=va_arg(arg_ptr,int))>END_P) \ <BR> &&((y[p_c]=va_arg(arg_ptr,int))>END_P)\ <BR> && p_c<=200) // 不是最後一点且小於 200 个点 <BR> <BR> p_c++; <BR> <BR> if(p_c<3) return ; // 不到 3 点不成一多边型,So 跳出 <BR> <BR> for(i=0;i<p_c-1;i++) <BR> // 划线,每个 Compiler 不同,自行修改 <BR> line(x[i],y[i],x[i+1],y[i+1],color); <BR> // 最後一条线 <BR> line(x[0],y[0],x[p_c-1],y[p_c-1],color); <BR> <BR> va_end(arg_ptr); <BR> } <BR> <BR> 好了!!以上就是不定参数介绍,若还有问题再问我啦!!其实不定参 <BR> 数应用还很多,当你了解後,慢慢会发现更多技巧!! <BR> (P.S. 记得不可用 pascal 宣告函式呦!!) <BR> <BR>预告: <BR> 最近也许因为 GAME 的关系,越来越多人开始使用 Watcom C/C++ <BR> 当然也就有很多这套 Compiler 的问题出现,下篇就为你介绍一些写 <BR> 作技巧,至於使用方法,看看 HELP 应该就没问题了,当然 Watcom C <BR> 东东实在太多,So 只介绍一部份,再有问题再问啦!! <BR> <BR> < 写 GAME 利器 - Watcom C/C++ > <BR> <BR>--------------------------------------------------------------- <BR> <BR> <<< 本文版权属於作者 >>> <BR> 本文章可自由引用,拷贝,传阅,但需保持本文章之完整性,从标题 <BR> 到最後版权宣告,且不能用来做商业用途!! <BR> <BR> 若有任何问题,或是错误之处,欢迎来信批评指教!! 谢谢!! <BR> <BR> <BR> <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -