OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4929|回复: 15

请教结构体的转换的问题

[复制链接]

7

主题

65

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
3198
金钱
3198
注册时间
2013-12-8
在线时间
439 小时
发表于 2014-1-1 21:20:56 | 显示全部楼层 |阅读模式
我现在有2个结构体
typedef struct {   //数据结构
u8 MEM_NO;
u8 ON; //状态
u16 X;     //坐标X
u16 Y;   //坐标Y
u8 W;     //宽度
u8 H;   //高度
u8 Key;
u8 B;
} BUTTON_Obj;

typedef struct {   //内存数据结构
u8 DATA[10];
} MEM_TypeDef;

 MEM_TypeDef MEM[10];
BUTTON_Obj button;
button中的数据在程序中赋值了,
我现在要把button内的数据储存到MEM[0]中去因该怎么实现啊



















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-1 21:26:00 | 显示全部楼层
1.MEM_TypeDef MEM[10];//定义10个MEM_TypeDef类型的结构体?这是结构体变量数组啊。你是想传到结构体里的成员数组去吧??
2.既然这样第二个还有定义结构体的必要么?
回复 支持 反对

使用道具 举报

7

主题

65

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
3198
金钱
3198
注册时间
2013-12-8
在线时间
439 小时
 楼主| 发表于 2014-1-1 21:34:04 | 显示全部楼层
回复【2楼】hechao3225:

1.MEM_TypeDef MEM[10];//定义10个MEM_TypeDef类型的结构体?这是结构体变量数组啊。你是想传到结构体里的成员数组去吧??
2.既然这样第二个还有定义结构体的必要么?

---------------------------------
是要传到结构体数组中去,定义BUTTON_Obj 是因为我除了BUTTON以外还要定义其他的结构体如LAMP_Obj传到MEM[]中去,每个结构体的长度都为10字节,传到MEM中的数量不定的,BUTTON可能2个、LAMP可能2个 也可能BUTTON3个 、LAMP2个
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-1-1 21:42:46 | 显示全部楼层
memcpy(void *dest, const void *src, size_t n);  可以么
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

7

主题

65

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
3198
金钱
3198
注册时间
2013-12-8
在线时间
439 小时
 楼主| 发表于 2014-1-1 22:02:19 | 显示全部楼层
回复【4楼】745021926:
---------------------------------
   memcpy(MEM[1],BUTTON_I,10);

USER\main.c(146): error:  #167: argument of type "MEM_TypeDef" is incompatible with parameter of type "void *restrict"
USER\main.c:               memcpy(MEM[1],BUTTON_I,10);
USER\main.c:                      ^
USER\main.c(146): error:  #167: argument of type "BUTTON_Obj" is incompatible with parameter of type "const void *restrict"
USER\main.c:               memcpy(MEM[1],BUTTON_I,10);
USER\main.c:                             ^

不行,报错啊,该怎么用这个函数
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-1 22:15:51 | 显示全部楼层
回复【3楼】zgp0518:
---------------------------------
哦,原来如此。没遇到过,你试试转成结构体指针,数组也转成指针型的,看能不能把成员传进去。同求大神指点!
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-1 22:17:52 | 显示全部楼层
回复【4楼】745021926:
---------------------------------
大神,能把子函数具体写出来么?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-2 08:26:00 | 显示全部楼层
回复【5楼】zgp0518:
---------------------------------
这里写错了memcpy(MEM[1],BUTTON_I,10);

应该是这样的memcpy(MEM,BUTTON_I,10);
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-1-2 08:39:27 | 显示全部楼层
还有#include <string.h>;
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 12:05:36 | 显示全部楼层
回复【8楼】Badu_Space:
---------------------------------
这个可以么?能直接传到结构体内的数组里去吗?他是要传到DATA里去吧,这个MEN是结构体的地址啊
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-2 12:18:29 | 显示全部楼层
回复【10楼】hechao3225:
---------------------------------
MEM_TypeDef MEM[10];你这句不就是定义了一个结构体指针了么?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 12:46:54 | 显示全部楼层
回复【11楼】Badu_Space:
---------------------------------
我的意思是这个指针是结构体变量的地址,不是应该指向结构体成员数组DATA的地址么?C语言功底不扎实,我是想问通过结构体地址可以直接传到内部的成员么?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-2 12:53:17 | 显示全部楼层
回复【12楼】hechao3225:
---------------------------------

MEM_TypeDef   mem_init;
mem_init          mem_data[10];

mem_data[0] = 0x55;
mem_data[1] = 0xaa;

printf("data[0] = %x\r\n",mem_init.DATA[0]);
printf("data[1] = %x\r\n",mem_init.DATA[1]);

这样测试下看下出口打印出的值是不是和你传进去的值一样
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 13:01:12 | 显示全部楼层
回复【13楼】Badu_Space:
---------------------------------
问题来了,如果这个结构体里有几个成员数组,通过这个结构体指针他是传到哪个?比如DATA1[10],DATA2[10]。我觉得memcpy();这个函数的第一个参数不应该是这个结构体的地址MEM,而是DATA的地址,memcpy(&MEM[0].DATA,BUTTON_I,10)
回复 支持 反对

使用道具 举报

7

主题

65

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
3198
金钱
3198
注册时间
2013-12-8
在线时间
439 小时
 楼主| 发表于 2014-1-2 14:30:33 | 显示全部楼层
typedef struct   {    //数据结构
u8 MEM_NO;
u8 ON;     //状态
u16 X;           //坐标X
u16 Y;       //坐标Y
u8 W;           //宽度
u8 H;       //高度
u8 Key;
u8 B;
} BUTTON_Obj;

typedef struct   {    //内存数据结构
u8 DATA[10];
} MEM_TypeDef;

 MEM_TypeDef MEM[10];
BUTTON_Obj button;

MEM_TypeDef MEM1;
MEM_TypeDef *mem1;
BUTTON_Obj *butt;



mem1 = &MEM1;
butt = & button ;
mem1 = (MEM_TypeDef *)butt;
MEM[0] = *mem1;

好像这样就可以了

回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-2 14:59:10 | 显示全部楼层
回复【15楼】zgp0518:
---------------------------------
恩,指针的用法了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表