函数的参数问题
假定有一个结构定义如下:
struct
{
int a;
int b;
int c;
}S;我想写一个函数,把变量名a,b,c作为输入参数
func(???)
{
S.??? = 1;
}
调用时
func(a); //使得S.a = 1
func(b); //使得S.b = 1
func(c); //使得S.c = 1
请问该如何实现呢?谢谢

解决方案 »

  1.   

    struct Data

    int a; 
    int b; 
    int c; 
    }S; func(Data& d) 

     d.a = 1;

      

  2.   

    func(int& x)
    {
    x = 1;
    }
    调用时:
    S s;
    func(s.a); /s.a=1
    func(s.b); /s.b=1
    func(s.c); /s.c=1
      

  3.   

    func(int& x)
    {
    x = 1;
    } 直接函数中修改你输入的参数
      

  4.   

    我试过这样写
    void func(int ver)
    {
      S.ver = 1;
    }
    编译不能通过:"ver不是S的成员"
    我的实际情况要复杂些。确实有必要写成一个函数,请帮帮我吧。
      

  5.   

    没想到这么快就有这么多热心人回答我的问题。谢谢了。
    我的实际情况比我的例子复杂,结构套结构。
    之所以想写成函数,是希望把复杂的判断交给函数,而不是让调用者去判断。
    weiym和cnzdgs的方法都是把判断交给调用者。
    我希望把判断交给函数。
    谢谢。
      

  6.   

    你这种要求,只能输入a ,b,c等,然后函数中判断 if(str == "a")等这种,然后switch来走不同分支
      

  7.   

    回答levelmouse
    func(s.a); /s.a=1 
    func(s.b); /s.b=1 
    func(s.c); /s.c=1 
    一点没错,但是3个函数该调用那个呢?
    也就是说让调用者去判断,我是想让函数内部判断。我觉得oyljerry讲的有道理些。
      

  8.   

    #define a 'a'
    #define b 'b'
    #define c 'c'
    struct 

    int a; 
    int b; 
    int c; 
    }S; 
    void func(char d) 

    switch(d)
    case 'a':
       d.a = 1; 
       break;
    case 'b':
       d.b = 1;
       break; 
    case 'c':
       d.c = 1;
       break; 
    default:
       break;
    }
      

  9.   

    按照你的输入参数,if判断或者走switch
      

  10.   

    oyljerry
    你的回答我看明白了。如果没有更好的方法,就这样写了。
    不过确实有点不甘心,我的实际情况是有100多个结构。
    函数判断需要写到哪一个结构里。也就是说想把结构名作为参数传递。
    你的方法一定可以实现,不过switch语句得有100多个分支,我还得定义100多个常量。
      

  11.   

    caiwuke谢谢你,你把oyljerry的主意具体实现了。
      

  12.   

    如果函数不长可以考虑用宏,提供个思路看看能不能满足你的需要struct S 
    {
    int a ;
    int b ;
    int c ;
    };void func ( int & x )
    {
    x = 1 ;
    }#define FUNC(sname,vname) \
    {\
    sname.vname = 1 ;\
    }#define FUNC2(vname) \
    {\
    s.vname = 1 ;\
    }int main(int argc, char* argv[])
    {
    S s ;
    func ( s.a ) ;
    FUNC ( s , a )
    FUNC2 ( a ) ;
    return 0;
    }
      

  13.   

    回答cnzdgs
    可能我没说清楚。我是想把问题简化一点。
    实际情况大约是这样的,我有大约100多个Point需要保存。
    可是还得细分8种情况,想让函数具体判断存在什么地方。
    typedef struct
    {
    CPoint p001;
    ...
    CPoint p100;
    }POINTS;struct
    {
    POINTS condition1;
    ...
    POINTS condition8;
    }Positions;调用者很清楚需要保存的是哪一个Point,可是不清楚需要保存在哪一个condition里。
    希望函数作出判断
      

  14.   

    谢谢devinside
    你的回答我看明白了。
    我希望由函数内部作判断,而不是把判断交给调用者
      

  15.   

    讲清楚就好办了,有两种方法:一种是调用函数获取condition的指针,然后调用者自己来处理;另一种是把Point的偏移量(相对地址)作为参数传给函数,让函数来处理。
      

  16.   

    函数的工作是保存Point的x, y值
    例如
    SavePoint(???, int X, int Y)
    {
    if(...) {Positions.Condition1.???.x=X; Positions.Condition1.???.y=Y;}
    ... 
    }
    想这样调用
    SavePoint(P001, 100, 200)
      

  17.   

    把问题重新描述如下:
    实际情况大约是这样的,我有大约100多个Point需要保存。 
    可是还得细分8种情况,需要函数判断存在什么地方。 
    typedef   struct 

    CPoint   p001; 
    ... 
    CPoint   p100; 
    }MYPOINTS; struct 

    MYPOINTS   condition1; 
    ... 
    MYPOINTS   condition8; 
    }Positions; 调用者很清楚需要保存的是哪一个Point,例如p001,可是不清楚需要保存在哪一个condition里。 
    希望函数作出判断 函数的工作是保存某一个Point的x, y值 
    例如 
    SavePoint(???, int X, int Y) //???是p001, p002等 

    if(...) {Positions.Condition1.???.x=X; Positions.Condition1.???.y=Y;} 
    ... 

    想这样调用 
    SavePoint(p001, 100, 200);
    保存p001的位置,但是具体存在哪一个condition里,需要函数判断。 应为管理的Point多,所以调用的地方也多,如果让调用者判断,不但重复代码多,而且耦合度高。
      

  18.   

    cnzdgs,谢谢你的关心。你说的
    有两种方法:一种是调用函数获取condition的指针,然后调用者自己来处理;另一种是把Point的偏移量(相对地址)作为参数传给函数,让函数来处理。
    确实都可以实现。
    比较起来,我觉得1可能更好一点
    方法1,调用函数获取condition的指针,然后调用者自己来处理。
    调用处的语句大约是
    MYPOINTS ptr = GetPointer();
    ptr->p001.x=X;
    ptr->p001.y=Y;
    另一个调用处的语句大约是
    MYPOINTS ptr = GetPointer();
    ptr->p002.x=X;
    ptr->p002.y=Y;
    虽然可能多次重复,但是可能是最好的方法了。
      

  19.   

    小结想把一个变量名ver作为参数传递给一个函数。
    然后在函数里这样使用这个参数:
    XXXX.ver.YYYY 或者 XXXX->ver->YYYY(如果ver是指针)
    是不可能的。
    ver只能出现在最左边。只能这样使用
    ver.YYYY或者ver->YYYY在所有的建议里,我觉得cnzdgs的方法1最简单。
    当然不是说别人的不好,只不过对于我的特殊情况,其他的方法稍微麻烦一点。感谢所有回答了我的问题的人。