| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6078 人关注过本帖
标题:参数个数不确定,函数该如何写?
只看楼主 加入收藏
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
结帖率:95.24%
收藏
已结贴  问题点数:20 回复次数:12 
参数个数不确定,函数该如何写?
比如VB中的ParamArray关键字。
搜索更多相关主题的帖子: 关键字 如何 
2011-10-22 19:52
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
不知道C可不可以做到……求赐教啊……

一个单片机就让我头疼不已~~~
2011-10-22 19:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
你没看见过标准main()函数的参数写法?

int main(int argc, char* argv[])

借鉴一下第二个参数的形式吧。

授人以渔,不授人以鱼。
2011-10-22 19:57
ileelsai
Rank: 5Rank: 5
等 级:职业侠客
帖 子:87
专家分:303
注 册:2011-9-25
收藏
得分:10 

#include "stdio.h"
#include  "malloc.h"


typedef int  ElemType;
//数组的顺序存储表示
#include "stdarg.h"
//提供宏va_start,va_arg和va_end;
//用于存取变长参数表


#define MAX_ARRAY_DIM  8
//数组维数的最大值

typedef struct
{ElemType *base;   //数组元素基址
int dim;      //数组维数
int *bounds;    //数组维界(每一维的长度)基址
int *constants;   //数组映像函数常量基址,可以看成
                 //是存储每一维的下标换算成对应数组元素地址的方法
} Array;


//若维数dim和各维长度合法,则构造相应的数组A,并返回1
int InitArray(Array &A,int dim,...)
{
    int elemtotal=1,i;  //elemtotal是元素总值
    va_list ap;    //首先定义了一个va_list变量,之歌参看变参的使用
    if(dim<1||dim>MAX_ARRAY_DIM)
    return 0;
    A.dim=dim;   //初始化数组的维度
    A.bounds=(int *)malloc(dim*sizeof(int));  //初始化数组的维界基址
    if(!A.bounds)
       exit(0);
     //对已定义va_list变量进行初始化,第二个变量为可变变量的前一个参数dim
     va_start(ap,dim);
     for(i=0;i<dim;++i)
     {
         //保存各维的长度,va_arg取得类型为int的可变参数值
         *(A.bounds+i)=va_arg(ap,int);
         if(*(A.bounds+i)<0)
            return 0;
          elemtotal=*(A.bounds+i);   //记录数组中的元素个数
     }
     va_end(ap);//结束可变参数的获取
     //初始化数组元素的基址,分配定长的存储空间
     A.base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
     if(!A.base)
        exit(0);
      //初始化数组映像函数常量基址
      A.constants=(int *)malloc(dim*sizeof(int));
      if(!A.constants)
         exit(0);
       *(A.constants+dim-1)=1;
       for(i=dim-2;i>=0;--i)
         *(A.constants+i)=*(A.bounds+i+1)**(A.constants+i+1);
         return 1;
}

//销毁数组A,将分配了地址的元素进行释放置空
int DestroyArray(Array &A)
{
    if(A.base)
    {
       free(A.base);
       A.base=NULL;
    }
    else
    return 0;
    if(A.bounds)
    {
       free(A.bounds);
       A.bounds=NULL;
    }
    else
      return 0;
    if(A.constants)
    {
       free(A.constants);
       A.constants=NULL;
    }
    else
     return 0;
     return 1;
}

//Value()、Assign()调用此函数
//若ap指示的各下标值合法,则求出该元素在A中的相对地址off
int Locate(Array A,va_list ap,int *off)
{
    int i,ind;
    *off=0;
    for(i=0;i<A.dim;i++)
    {
        ind=va_arg(ap,int);
        if(ind<0||ind>=A.bounds[i])
           return 0;//continue
        *off+=A.constants[i]*ind;
    }
   return 1;
}

//...依此为各维的下标值,若各下标合法,则e被赋值为A的相应的元素值
//在VC++中,...之前的形参不能是引用类型
int Value(ElemType &e,Array A,...)
{
    va_list ap;
    int result;
    int off;
    va_start(ap,A);
    if((result=Locate(A,ap,&off))==0)   //调用Locate()
       return result;
     e=*(A.base+off);
     return 1;
}

//...依此为各维的下标值,若各下标合法,则将e的值赋给A的指定的元素
int Assign(Array &A,ElemType e,...)
{
    va_list ap;
    int result;
    int off;
    va_start(ap,e);
    if((result=Locate(A,ap,&off))==0)  //调用Locate()
       return result;
     *(A.base+off)=e;
     return 1;
}

int main()
{Array A;
int i,j,k,*p,dim=3,bound1=3,bound2=4,bound3=2; //a[3][4][2]数组
   ElemType e,*p1;
   InitArray(A,dim,bound1,bound2,bound3);//构造3*4*2的3维数组A
   p=A.bounds;
   printf("A.bounds=");
   for(i=0;i<dim;i++)   //顺序输出A.bounds维数
    printf("%d",*(p+i));
   p=A.constants;
   printf("\nA.constants=");
   for(i=0;i<dim;i++)   //顺序输出A.constants
     printf("%d",*(p+i));
    printf("\n%d页%d行%d列矩阵元素如下:\n",bound1,bound2,bound3);
    for(i=0;i<bound1;i++)
    {
       for(j=0;j<bound2;j++)
       {
          for(k=0;k<bound3;k++)
          {
             //将i*100+j*10+k赋值给A[i][j][k]
             Assign(A,i*100+j*10+k,i,j,k);
             Value(e,A,i,j,k) ; //将A[i][j][k]的值赋给e
             printf("A[%d][%d][%d]=%2d",i,j,k,e);//输出A[i][j][k]
            
          }
          printf("\n");
       }
       printf("\n");
    }
    p1=A.base;
    printf("A.base=\n");
    for(i=0;i<bound1*bound2*bound3;i++)   //顺序输出A.base
    {
       printf("%4d",*(p1+i));
       if(i%(bound2*bound3)==bound2*bound3-1)
         printf("\n");
    }
    DestroyArray(A);
    return 0;
}


[ 本帖最后由 ileelsai 于 2011-10-22 20:09 编辑 ]
2011-10-22 20:03
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
3楼说的对  这两个参数的含义是传递的命令行数  和每一行的内容

                                         
===========深入<----------------->浅出============
2011-10-22 20:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C++支持不定数目参数的语法,但其实它自己也不赞成多用,能免则免,还是自己分析字符串的好。

授人以渔,不授人以鱼。
2011-10-22 22:56
yj269172025
Rank: 2
等 级:论坛游民
帖 子:41
专家分:81
注 册:2011-9-29
收藏
得分:0 
还是第一次听说,虽然main的标准形式有两个参数,在某种角度我不觉得那是不定参数我也没有见过,不过我在正在学的java中倒是遇到过,有点迷惑,
2011-10-22 23:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是一个还是多个,其实在于你如何看一个数据。向函数压入一个int参数,你觉得是一个参数,我也可以觉得是2个、或4个。真正的不定参数语法,无法在编译阶段检查类型,对C/C++这类算是强类型的语言来说,是不提倡的。

授人以渔,不授人以鱼。
2011-10-22 23:12
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
谢谢各位。
深思熟虑之下,还是用3楼的方法舒适些。

PS 4楼 V5

[ 本帖最后由 dreamofgod 于 2011-10-23 16:09 编辑 ]

一个单片机就让我头疼不已~~~
2011-10-23 16:08
yj269172025
Rank: 2
等 级:论坛游民
帖 子:41
专家分:81
注 册:2011-9-29
收藏
得分:0 
我想了想,C中其实有很多参数不确定的函数,比如基本的printf()或scanf()就是不确定的,可以输入或打印多个数,也可以是一个数,至于怎么写我还没有去研究
2011-10-23 21:00
快速回复:参数个数不确定,函数该如何写?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012109 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved