xiaobendan 发表于 2018-5-15 09:52:27

能否通过类似下标的方法访问结构体中不同类型的成员?

例如里面有10个CHAR,10个INT,两个LONG
并且是交叉排列的,我要用一个循环为他赋值,能行不?

jiaowoxiaolu 发表于 2018-5-15 09:53:53

你自己找准位置,注意大小端,没什么不可以

miaoguoqiang 发表于 2018-5-15 10:10:01

可以。用指针指向结构体。下标就可以访问

xiaobendan 发表于 2018-5-15 13:00:02

miaoguoqiang 发表于 2018-5-15 10:10
可以。用指针指向结构体。下标就可以访问

我知道这样是可以的
比如结构体里面全是CHAR
然后用一个CHAR*就可以
但是里面是这样的:CHAR ;INT;LONG;INT;CHAR;呢?
是不是得需要这样,INT = CHAR|CHAR<<8?

miaoguoqiang 发表于 2018-5-15 13:24:30

xiaobendan 发表于 2018-5-15 13:00
我知道这样是可以的
比如结构体里面全是CHAR
然后用一个CHAR*就可以


对的。小端模式就是低位在前

yoz 发表于 2018-5-15 13:28:46

可以写一个数组用来存储每个成员的偏移量

ywlzh 发表于 2018-5-15 16:54:45

这个问题 测试一下就可以看到结果了吧

728196 发表于 2018-5-15 17:00:51

不建议写这种 屎一样的代码。

小李非刀 发表于 2018-5-15 17:12:11

用指针可以访问,但是不建议,可读性非常差,用了结构,就要用结构的访问方式。

xiaobendan 发表于 2018-5-16 07:05:35

小李非刀 发表于 2018-5-15 17:12
用指针可以访问,但是不建议,可读性非常差,用了结构,就要用结构的访问方式。 ...

是啊,结构看起来更清晰
只是突然想到的,比如全是CHAR,然后每个成员都+1,一个循环就OK,要是类型不一样就不能这样了。

xivisi 发表于 2018-5-16 10:06:53

本帖最后由 xivisi 于 2018-5-16 10:09 编辑

xiaobendan 发表于 2018-5-16 07:05
是啊,结构看起来更清晰
只是突然想到的,比如全是CHAR,然后每个成员都+1,一个循环就OK,要是类型不一 ...

楼主1W积分?

反正都是 char;long
直接一个结构体指针不就行了?

struct{char a; int b;}   *temp;

然后再循环, 如果不是成对出现,最后一个单独处理就行

=====================================================================

好吧,我没看全,
存储偏移地址吧,只有这样

xiaobendan 发表于 2018-5-16 10:28:19

xivisi 发表于 2018-5-16 10:06
楼主1W积分?

反正都是 char;long


偏移地址是自己一个一个搞
还是有什么方法自动获取?

xiaobendan 发表于 2018-5-16 10:30:27

xivisi 发表于 2018-5-16 10:06
楼主1W积分?

反正都是 char;long


关键是很乱,比如有100个成员,乱排列的,比如5个char,10个 int,15个long,之后又是3个char,2个long,5个char,6个long……

xivisi 发表于 2018-5-16 10:32:44

xiaobendan 发表于 2018-5-16 10:30
关键是很乱,比如有100个成员,乱排列的,比如5个char,10个 int,15个long,之后又是3个char,2个long,5 ...

offsetof()

xiaobendan 发表于 2018-5-16 10:35:27

xivisi 发表于 2018-5-16 10:32
offsetof()

这个怎样用?

xivisi 发表于 2018-5-16 10:41:39

xiaobendan 发表于 2018-5-16 10:35
这个怎样用?

offsetof你可以搜索的……

offsetof的作用是取一个结构体中成员的偏移量,会得到一个常数。
按你的原始结构体定义,获取所有成员的偏移量,也可以相邻相减得到当前的成员的大小,就得到数据类型,根据这个类型,进行赋值。

xiaobendan 发表于 2018-5-16 12:37:45

xivisi 发表于 2018-5-16 10:41
offsetof你可以搜索的……

offsetof的作用是取一个结构体中成员的偏移量,会得到一个常数。


这个在keil c51中有?
是不是还是得一个一个的取出来放到一个数组中,然后再搞

luolj 发表于 2018-12-18 16:35:11

10个CHAR,10个INT,2个LONG,可以用结构体联合体方式解决。

//变量结构体
typedef struct
{
        char charVar;               
        int   intVar;                               
       long longVar;                                                               
}VAR_STRU;

//变量联合
typedef union
{
   char   byte;        //在联合中设置一个数组变量,10+10*2+2*4
   VAR_STRUData;        //结构体数组变量
}VAR_UNION;


VAR_UNION user;
/////操作变量,比如清零/////
直接清零联合中的值:
for(i=0;i<28;i++)
{
user.byte=0;
}

单独清除某个值:
user.Data.charVar=0;       

其它操作以此类推。

luolj 发表于 2018-12-18 16:37:53

如果内部成员交叉排列,自己制作表格取得对应位置操作即可。
页: [1]
查看完整版本: 能否通过类似下标的方法访问结构体中不同类型的成员?