OpenEdv-开源电子网

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

遍历结构体成员变量

[复制链接]

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
发表于 2016-5-16 11:24:16 | 显示全部楼层 |阅读模式
1金钱
结构体内部的成员比较复杂,有int,char,union,struct等各种类型,还有嵌套结构体,怎么能打印出现在这个结构体中的所有变量?

最佳答案

查看完整内容[请看2#楼]

现在可以了,用强制指针就可以
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
 楼主| 发表于 2016-5-16 11:24:17 | 显示全部楼层
civic7366 发表于 2016-5-16 16:47
除非作記號吧...
加幾個成員裡面放 char count ... int count

现在可以了,用强制指针就可以
回复

使用道具 举报

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
 楼主| 发表于 2016-5-16 11:24:51 | 显示全部楼层
还要考虑字节对齐的问题
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-5-16 11:41:43 | 显示全部楼层
pack(1)之后打印整个结构体长度的字节?
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
 楼主| 发表于 2016-5-16 16:16:46 | 显示全部楼层
ianhom 发表于 2016-5-16 11:41
pack(1)之后打印整个结构体长度的字节?

[mw_shl_code=c,true]typedef struct
{
        int a;
        char b;
        float c;
}arm_test;

arm_test a;
arm_test *b;
main()
{
        a.a = 1;
        a.b = 'a';
        a.c = 3.00;
        b = &a;
        printf("a = %d , b = %c , c = %f\r\n",a.a,a.b,a.c);
        printf("a = %d , b = %c , c = %f\r\n",b->a,b->b,b->c);
        
        printf("a = %d , b = %c , c = %f\r\n",b->a,b->b,b->c);
        printf("add = %p ,add = %p\r\n",&a,b);
}
[/mw_shl_code]

这个小函数是我抽象出来的,我想实现这样的一种效果,我的工程远比这个麻烦。也可以是仅仅打印出数值有可以。只要是能访问就行。
这种办法太笨了,可移植性和可维护性又太差,比如在结构体中新加成员变量,我百度了好多的方法,都没有大的参考价值,所以,开本帖。
求教一种比较好的方法,我也是很傻。
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-5-16 16:47:23 | 显示全部楼层
除非作記號吧...
加幾個成員裡面放 char count ... int count

然後datatype一樣的都連續放在一起
再根據起始位址+typecount位移訪問

噗~也是爛方法....

回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2016-5-16 20:16:07 | 显示全部楼层
16 行写成一个 void print(const arm_test* pData) , 17 和 19 行就可以调用了 .

20 行要再封装一个函数 .

自己定义的结构体如何显示必须要自己指定 , 除非是自己做工具自动生成显示代码 , 标准工具是不包含这个的 .

但已经指定过了 , 嵌套结构体就可以嵌套调用显示函数 , 注意不要死循环即可 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2282
金钱
2282
注册时间
2013-12-16
在线时间
448 小时
发表于 2016-5-16 22:27:19 | 显示全部楼层
本帖最后由 zdfwyh 于 2016-5-16 23:11 编辑

编制两个程序文件main.c和type.c,main.c演示了如何定义结构体和一个结构体长度数组
type.c定义了结构体内容,如果需要增加和修改结构体内容,只要修改type.c就行,抛砖引玉
mian.c
[mw_shl_code=c,true]
#include "stdio.h"


#define DATA(a,b,c) a b;
typedef struct
{
#include "type.c"
}arm_test;
        
#define DATA(a,b,c) sizeof(a),

const char arm_test_size[]={
#include "type.c"
};
        
#define DATA(a,b,c) printf(c,*(a *)p);p+=arm_test_size[i++];
void myPrintf(void *p)
{
        int n,i;
        n=sizeof(arm_test);
        i=0;

        #include "type.c"


}
void main()
{
        arm_test p;
        
        p.a=1;
        p.b='d';
        p.c=0.9;
        myPrintf((void*)&p);
        while(1);
}[/mw_shl_code]

type.c
[mw_shl_code=c,true]
DATA(int  ,a,"%d\r\n")
DATA(char ,b,"%c\r\n")
DATA(float,c,"%f\r\n")
        
#undef DATA
[/mw_shl_code]
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-5-17 08:15:33 | 显示全部楼层
主要是你用什么打印

你要是接收也是可以编程的,
你就把两边的结构体编成一样的,

然后强制转化指针就可以了

(一般都是高端的,不用考虑,碰到不是的算你活该)
回复

使用道具 举报

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
 楼主| 发表于 2016-5-17 11:40:08 | 显示全部楼层
止天 发表于 2016-5-17 08:15
主要是你用什么打印

你要是接收也是可以编程的,

我现在强制转换了一个u16的指针,就可以用了,真是谢谢大家,但是我现在要是强制转换成u32的指针,就崩了,我现在在想是不是对齐的原因
回复

使用道具 举报

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
 楼主| 发表于 2016-5-17 11:42:34 | 显示全部楼层
shihantu 发表于 2016-5-16 20:16
16 行写成一个 void print(const arm_test* pData) , 17 和 19 行就可以调用了 .

20 行要再封装一个函数 ...

是,谢谢您,我现在已经能正常工作了,用一个强制转换就可以
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 04:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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