BBS水木清华站∶精华区

 
 
       战   斗   世   家   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++ > 
 
--------------------------------------------------------------- 
 
                  <<< 本文版权属於作者 >>> 
     本文章可自由引用,拷贝,传阅,但需保持本文章之完整性,从标题 
  到最後版权宣告,且不能用来做商业用途!! 
 
     若有任何问题,或是错误之处,欢迎来信批评指教!! 谢谢!! 
 
 
 
 

BBS水木清华站∶精华区