yulutong 发表于 2009-2-26 14:05:41

请教如何按下标来找到结构体成员?

有这样个结构体
struct {
u8d1
u8d2
u8d3
u16 time

}sum;
我想通过个变量i来操作。
i=1 时 d1 = x;
i=2 ...

我理想中的操作应该是 sum->"(i)" 这样来操作,我现在还不会实现这样的功能
不知道我这样有没有表达清楚

aviator 发表于 2009-2-26 14:17:04

你是想用数组吧,只有所有数据类型都一样才能通过变量来索引。

yulutong 发表于 2009-2-26 14:55:24

数组里面定义的变量都要一样了,我说不定里面定义要float型的。
我现在用的这样的方法,不知道行不行?
struct {
u8 aaa;
u8 d1;
...


}sum;

u8 *lmp;
lmp=&sum.aaa 来查找首地址
再通过lmp+x 来具体跳转

aviator 发表于 2009-2-26 15:04:17

数据类型不同就不行。

当然你可以另外建立一个指针数组,按顺序保存结构体里每个变量的地址。
通过指针数组索引,查找。最后你找到了,可你怎么知道第i个变量是什么数据类型呢?你还是没办法得到这个变量的值。

你陷入了错误的思维,换一种方式来处理吧。

yulutong 发表于 2009-2-26 15:18:47

说的也是,这种貌似也不行,我再想想。。。

rainyss 发表于 2009-2-26 15:49:37

struct {
u8d1
u8d2
u8d3
u16 time

}sum;

...
i=0;
do{
   sum.d1=i;
   i++;
while(i<5);


你是不是这意思?

yulutong 发表于 2009-2-26 15:58:10

不是。
这个结构体里有不同类型的变量。
我在程序中要调用这些变量。
   比如
   switch (i)
      {
   case 0 :d0
   case 1 :d1
    ...
..

         }


我结构体中变量有30个,想用个循环来操作

harng 发表于 2009-2-26 16:07:04

把i定义成结构指针就可以了,不明白可以去翻下书!!

eduhf_123 发表于 2009-2-26 16:44:49

如果楼主只是需要访问d1~d3,那么可以用强制类型转换来完成:
u8 *pel = (u8 *)(&sum);
pel = 1;             //访问d1成员
pel = 2;             //访问d2成员
pel = 3;             //访问d3成员

同上,如果楼主要访问的这30个变量,类型都一样的话,可以在定义结构体类型的时候,让它们连续排列,并排在结构体的首部,就可以用上面的方法来访问它们了。

rainyss 发表于 2009-2-26 19:20:44

我明白你想干什么了,说实话,基本上办不到,这种功能只有更高级的语言才有.

lxyppc 发表于 2009-2-26 21:19:46

8楼的是正解
你必须要保证这些变量是连续的
但是你为什么不这样定义
struct {
u8d;
u16 time

}sum;
sum.d = xxx

lxyppc 发表于 2009-2-26 21:51:28

晕,看明白了,有个要求是不同类型的,算我上面的没说过

楼主现要实现不同的类型用同一种方式来索引,高级点的语言里面叫做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);
}

dragonball 发表于 2009-2-26 22:18:47

要不这样,变通一下,把u8的放一起u16的放一起,然后用两个循环分别来赋值不就行了。

yulutong 发表于 2009-2-27 07:35:15

11楼里你写的只有4种不同类型的变量了,如果每种变量有不同的数量,你没有写出来怎么赋值。

lxyppc 发表于 2009-2-27 21:58:39

变量可以自己再定义,也可再往里面加更多的变量
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};
就行了

xiaobendan 发表于 2014-3-17 10:14:59

12楼的方法,好像没有节省存储空间,看起来很繁琐,不如干脆用统一类型的数组,然后用类型转换操作了。
我还看到用一个数组建立一个索引表的方法,看起来也不会节省空间,而且实际上像BIT类型要是存放在EEPROM中,也得按CHAR型来保存的吧
不知道我理解的对不对
页: [1]
查看完整版本: 请教如何按下标来找到结构体成员?