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毫秒