函数的参数问题
假定有一个结构定义如下:
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
请问该如何实现呢?谢谢
假定有一个结构定义如下:
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
请问该如何实现呢?谢谢
{
int a;
int b;
int c;
}S; func(Data& d)
{
d.a = 1;
}
{
x = 1;
}
调用时:
S s;
func(s.a); /s.a=1
func(s.b); /s.b=1
func(s.c); /s.c=1
{
x = 1;
} 直接函数中修改你输入的参数
void func(int ver)
{
S.ver = 1;
}
编译不能通过:"ver不是S的成员"
我的实际情况要复杂些。确实有必要写成一个函数,请帮帮我吧。
我的实际情况比我的例子复杂,结构套结构。
之所以想写成函数,是希望把复杂的判断交给函数,而不是让调用者去判断。
weiym和cnzdgs的方法都是把判断交给调用者。
我希望把判断交给函数。
谢谢。
func(s.a); /s.a=1
func(s.b); /s.b=1
func(s.c); /s.c=1
一点没错,但是3个函数该调用那个呢?
也就是说让调用者去判断,我是想让函数内部判断。我觉得oyljerry讲的有道理些。
#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;
}
你的回答我看明白了。如果没有更好的方法,就这样写了。
不过确实有点不甘心,我的实际情况是有100多个结构。
函数判断需要写到哪一个结构里。也就是说想把结构名作为参数传递。
你的方法一定可以实现,不过switch语句得有100多个分支,我还得定义100多个常量。
{
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;
}
可能我没说清楚。我是想把问题简化一点。
实际情况大约是这样的,我有大约100多个Point需要保存。
可是还得细分8种情况,想让函数具体判断存在什么地方。
typedef struct
{
CPoint p001;
...
CPoint p100;
}POINTS;struct
{
POINTS condition1;
...
POINTS condition8;
}Positions;调用者很清楚需要保存的是哪一个Point,可是不清楚需要保存在哪一个condition里。
希望函数作出判断
你的回答我看明白了。
我希望由函数内部作判断,而不是把判断交给调用者
例如
SavePoint(???, int X, int Y)
{
if(...) {Positions.Condition1.???.x=X; Positions.Condition1.???.y=Y;}
...
}
想这样调用
SavePoint(P001, 100, 200)
实际情况大约是这样的,我有大约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多,所以调用的地方也多,如果让调用者判断,不但重复代码多,而且耦合度高。
有两种方法:一种是调用函数获取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;
虽然可能多次重复,但是可能是最好的方法了。
然后在函数里这样使用这个参数:
XXXX.ver.YYYY 或者 XXXX->ver->YYYY(如果ver是指针)
是不可能的。
ver只能出现在最左边。只能这样使用
ver.YYYY或者ver->YYYY在所有的建议里,我觉得cnzdgs的方法1最简单。
当然不是说别人的不好,只不过对于我的特殊情况,其他的方法稍微麻烦一点。感谢所有回答了我的问题的人。