Linux 版 (精华区)
发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标 题: ◇ 之四 -- 死角 - 不定参数
发信站: 紫 丁 香 (Sun Nov 15 21:51:32 1998), 转信
寄信人: guest.bbs@hgluo.hust.edu.cn
标 题: ◇ 之四 -- 死角 - 不定参数
发信站: 华南理工大学 BBS木棉站
日 期: Thu Feb 20 14:30:31 1997
战 斗 世 家 C 语言讲座 #4
作者: Lgw Lu
E-Mail: lgwlu@ms1.hinet.net
---------------------------------------------------------------
< 死角 - 不定参数 >
前言:
C 语言有很多功能,但有些功能很可能因为不常用,So 慢慢被人遗
忘。本篇介绍就是常不被人注意的 不定参数!!
内文:
相信大家都用过 printf 这个函数,这就是利用不定参数,来达到
参数项目不固定的目的。
但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI
C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支援的标准;常在
网路上看到有人推荐 K&R The C Programming Language 这本书,老
实说这本是不错(我以前也是看这本),但因为 K&R C 慢慢因为 ANSI
C 的完整标准出现,而面临考验,所以我建议若是初学者先从 ANSI C
看起,等对 ANSI C 的标准了解後,再回头看这本(其实不看也没差,虽
然它号称 C 语言圣经,但时代在变,有些东东开始不适用。不过还是有
看的价值)
// 宣告
|- > ANSI C 不定参数宣告方式
int FUNC(int,...)
^^^
固定的参数一定要放前面!!
// 副程式部份
int FUNC(int xx,...)
{
int tmp;
va_list arg_ptr; // 指向引数列表的 Pointer
va_start(arg_ptr,xx); // 从引数表中取得第一个引数
// 第一个引数就是 xx 自己
tmp=va_arg(arg_ptr,int); // 从引数表中取得int 型态引数
// 一直呼叫 va_arg 即可取得所
// 有引数
va_end(arg_ptr); // 取完後将 arg_ptr = NULL
// 以便归还 stack 空间
}
理论上不定参数是可以无限多的,但碍於 memory 及 stack 大小
所以项数通常有上限,如 Turbo C 最多 200 个,一超过就出现如下
" Fatal stack overflow error-System halted ",然後当掉,你连
暖开机都不行;所以当你使用一套 Compiler 时一定要有其参考手册
或资料,以免搞半天除错後,还找不出原因!!
(P.S. 像 Turbo C 2.0 只能用 4000 个 if ,....太多要注意的!!)
说了一堆,不知道你会用了没?! 最後用一个画多边型的函数做□
例,顺便做结束。
/* EX */
#include <stdarg.h> // 记得要 include 才能用
#define END_P -400 // 用来判断是否为最後一个参数
void DrawPoly(int color,...)
{
va_list arg_ptr;
int x[200],y[200]; // 最多 200 个点
int p_c=0; // 计算有几点
int i; // 计数器
va_list(arg_ptr,color);
while(((x[p_c]=va_arg(arg_ptr,int))>END_P) \
&&((y[p_c]=va_arg(arg_ptr,int))>END_P)\
&& p_c<=200) // 不是最後一点且小於 200 个点
p_c++;
if(p_c<3) return ; // 不到 3 点不成一多边型,So 跳出
for(i=0;i<p_c-1;i++)
// 划线,每个 Compiler 不同,自行修改
line(x[i],y[i],x[i+1],y[i+1],color);
// 最後一条线
line(x[0],y[0],x[p_c-1],y[p_c-1],color);
va_end(arg_ptr);
}
好了!!以上就是不定参数介绍,若还有问题再问我啦!!其实不定参
数应用还很多,当你了解後,慢慢会发现更多技巧!!
(P.S. 记得不可用 pascal 宣告函式呦!!)
预告:
最近也许因为 GAME 的关系,越来越多人开始使用 Watcom C/C++
当然也就有很多这套 Compiler 的问题出现,下篇就为你介绍一些写
作技巧,至於使用方法,看看 HELP 应该就没问题了,当然 Watcom C
东东实在太多,So 只介绍一部份,再有问题再问啦!!
< 写 GAME 利器 - Watcom C/C++ >
---------------------------------------------------------------
<<< 本文版权属於作者 >>>
本文章可自由引用,拷贝,传阅,但需保持本文章之完整性,从标题
到最後版权宣告,且不能用来做商业用途!!
若有任何问题,或是错误之处,欢迎来信批评指教!! 谢谢!!
--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--
Enjoy Linux!
-----It's FREE!-----
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.386毫秒