请教如何按下标来找到结构体成员?
有这样个结构体struct {
u8d1
u8d2
u8d3
u16 time
}sum;
我想通过个变量i来操作。
i=1 时 d1 = x;
i=2 ...
我理想中的操作应该是 sum->"(i)" 这样来操作,我现在还不会实现这样的功能
不知道我这样有没有表达清楚 你是想用数组吧,只有所有数据类型都一样才能通过变量来索引。 数组里面定义的变量都要一样了,我说不定里面定义要float型的。
我现在用的这样的方法,不知道行不行?
struct {
u8 aaa;
u8 d1;
...
}sum;
u8 *lmp;
lmp=&sum.aaa 来查找首地址
再通过lmp+x 来具体跳转 数据类型不同就不行。
当然你可以另外建立一个指针数组,按顺序保存结构体里每个变量的地址。
通过指针数组索引,查找。最后你找到了,可你怎么知道第i个变量是什么数据类型呢?你还是没办法得到这个变量的值。
你陷入了错误的思维,换一种方式来处理吧。 说的也是,这种貌似也不行,我再想想。。。 struct {
u8d1
u8d2
u8d3
u16 time
}sum;
...
i=0;
do{
sum.d1=i;
i++;
while(i<5);
你是不是这意思? 不是。
这个结构体里有不同类型的变量。
我在程序中要调用这些变量。
比如
switch (i)
{
case 0 :d0
case 1 :d1
...
..
}
我结构体中变量有30个,想用个循环来操作 把i定义成结构指针就可以了,不明白可以去翻下书!! 如果楼主只是需要访问d1~d3,那么可以用强制类型转换来完成:
u8 *pel = (u8 *)(&sum);
pel = 1; //访问d1成员
pel = 2; //访问d2成员
pel = 3; //访问d3成员
同上,如果楼主要访问的这30个变量,类型都一样的话,可以在定义结构体类型的时候,让它们连续排列,并排在结构体的首部,就可以用上面的方法来访问它们了。 我明白你想干什么了,说实话,基本上办不到,这种功能只有更高级的语言才有. 8楼的是正解
你必须要保证这些变量是连续的
但是你为什么不这样定义
struct {
u8d;
u16 time
}sum;
sum.d = xxx 晕,看明白了,有个要求是不同类型的,算我上面的没说过
楼主现要实现不同的类型用同一种方式来索引,高级点的语言里面叫做variant类型
这样做虽然能够用一个for实现,但是代码展开后也是很大的
#defineu8_t 1
#defineu16_t 2
#defineu32_t 3
#definefloat_t 4
typedef struct{
u8 t; // 类型说明
union{
u8 u8Var;
u16 u16Var;
u32 u32Var;
float fVar;
}un;
}my_t;
struct{
my_t d1;
my_t d2;
my_t d3;
my_t d4;
}sum = {{u8_t},{u16_t},{u32_t},{float_t}};
void InitMy_t(my_t* p)
{
switch(p->t){
case u8_t:
p->un.u8Var = 0x12; break;
case u16_t:
p->un.u16Var = 0x1234; break;
case u32_t:
p->un.u32Var = 0x12345678; break;
case float_t:
p->un.fVar = 12.3456;break;
default:
break;
}
}
for(my_t * p = &sum.d1; p<=&sum.d4; p++){
InitMy_t(p);
} 要不这样,变通一下,把u8的放一起u16的放一起,然后用两个循环分别来赋值不就行了。 11楼里你写的只有4种不同类型的变量了,如果每种变量有不同的数量,你没有写出来怎么赋值。 变量可以自己再定义,也可再往里面加更多的变量
struct{
my_t d1;
my_t d2;
my_t d3;
my_t d4;
my_t d5;
my_t d6;
}sum = {{u8_t},{u16_t},{u32_t},{float_t},{u8_t},{u16_t}};
把后面for的判定改成 p<=&sum.d6就行了
这种写法也不好
我很好奇楼主为什么会有这样的需求
如果你要给struct初值为零只需要简单的写成
struct{
u8 d1;
u8 d2;
u16 d3;
u8 d4;
u32 d5;
u16 d6;
}sum = {0};
就行了 12楼的方法,好像没有节省存储空间,看起来很繁琐,不如干脆用统一类型的数组,然后用类型转换操作了。
我还看到用一个数组建立一个索引表的方法,看起来也不会节省空间,而且实际上像BIT类型要是存放在EEPROM中,也得按CHAR型来保存的吧
不知道我理解的对不对
页:
[1]