共有回帖数  0  个 
	 
	
	
	
     
          
          
               
				
			 
				
					 
 
            
				   - 
						
						
							 
									相信大家都用过 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 %D
但是请注意,由於 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 语言圣经,但时代在变,有些东东开始不适用。不过还是有 
 看的价值) 
 // 
 // 固定的参数一定要放前面!! 
  
 int FUNC(int xx,...) 
 { 
 int tmp; 
 va_list arg_ptr; // 用va_list声明指向引数列表的 Pointer 
 va_start(arg_ptr,xx); // 从引数表中取得第一个引数 
 // 第一个引数就是 xx 自己(xx是最后一个固定变量) 
 tmp=va_arg(arg_ptr,int); // 从引数表中取得int 型态引数 
 // 一直呼叫 va_arg 即可取得所 
 // 有引数(第二个参数int是当前不定变量的类型 ) 
 va_end(arg_ptr); // 取完後将 arg_ptr = NULL 
 // 以便归还 stack 空间(要在所有的不定变量引用完之后再用va_end(),否则会有无法预测的结果。) 
 } 
 理论上不定参数是可以无限多的,但碍於 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_c3) return ; // 不到 3 点不成一多边型,So 跳出 
 for(i=0;ip_c-1;i++) 
 // 划线,每个 Compiler 不同,自行修改 
 line(x,y,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); 
 }
							 
							 
							 
							  
							  
							  楼主 2016-03-16 13:02 回复
						 
						 
           
          
          
         
   
         
      
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知