搜索
bottom↓
回复: 16

C 结构体怎么求和?

[复制链接]

出0入0汤圆

发表于 2014-5-27 10:02:40 | 显示全部楼层 |阅读模式
要实现结构体求和功能,大概是想这样实现(下面代码),实现不了,求解!
typedef struct{       
        U8 M_Model;      
        U8 M_Type;         
        U8 M_AddNo;      
        U8 M_Add[4];     
        U16 S_PowerNo;     
        U8 Check;
}sUseData;

sUseData   UseData;

void sum(void)
{
U8 i;
struct  sUseData  *p;       
        UseData.Check = 0;
        p = &UseData;
        for(i=0;i<sizeof(sUseData)-1;i++){
                UseData.Check += *(p+i);       
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-5-27 10:07:17 | 显示全部楼层
UseData.Check += *(p+i);      用p++试试

出0入0汤圆

发表于 2014-5-27 10:19:22 | 显示全部楼层
关注一下

出0入0汤圆

发表于 2014-5-27 10:23:17 | 显示全部楼层
这样定义U8 *p ?

出0入0汤圆

发表于 2014-5-27 10:27:05 | 显示全部楼层
完全不明白你说的是什么意思什么功能

出0入0汤圆

发表于 2014-5-27 10:34:27 | 显示全部楼层
p = &UseData;
地址强制转换下
改成
p = (u8 *)&UseData;

出0入0汤圆

发表于 2014-5-27 10:44:09 | 显示全部楼层
本帖最后由 Vampireyifeng 于 2014-5-27 10:46 编辑

sizeof(sUseData)-1是干什么的?如果不考虑结构体对齐,把p强制转换为U8 型指针

出0入0汤圆

发表于 2014-5-27 10:47:09 | 显示全部楼层
jacky_yhy 发表于 2014-5-27 10:27
完全不明白你说的是什么意思什么功能

+1
      

出0入0汤圆

发表于 2014-5-27 10:48:14 | 显示全部楼层
本帖最后由 cdh 于 2014-5-27 10:51 编辑

p+i?这样能引用结构体的成员吗?貌似不吧。

出0入0汤圆

发表于 2014-5-27 10:51:02 | 显示全部楼层
UseData.Check +=  (p++) -> Check;   

出0入0汤圆

发表于 2014-5-27 10:53:03 | 显示全部楼层
我认为,结构体是不同数据类型的一个集合,对结构体成员的求和很不方便不如用数组。一定想求和的话可以用结构数组指针,而不是结构变量指针!

出0入42汤圆

发表于 2014-5-27 11:10:12 | 显示全部楼层
本帖最后由 liyang121316 于 2014-5-27 11:40 编辑

你是想计算这个结构体的所有元素的累加和吧,这样试下
void sum(void)
{
U8 i;
u8  *p;        
        UseData.Check = 0;
        p = (u8*)&UseData;
        for(i=0;i<sizeof(sUseData)-1;i++){
                UseData.Check += *(p+i);        
        }
}

出0入42汤圆

发表于 2014-5-27 11:12:12 | 显示全部楼层
这是在做死的节奏啊, 中间有gap怎么办?!

对了, p是不可以这么加的, 一加地址就加了整个结构体大小, 飞出去了. p需要定义成u8* p=(u8*)&UseData.

出0入42汤圆

发表于 2014-5-27 11:28:39 | 显示全部楼层
albert_w 发表于 2014-5-27 11:12
这是在做死的节奏啊, 中间有gap怎么办?!

对了, p是不可以这么加的, 一加地址就加了整个结构体大小, 飞出去 ...

是啊,结构体声明的时候,对齐方式设置成1字节对齐

出0入0汤圆

发表于 2014-5-27 11:32:52 | 显示全部楼层
check 设置为0,参与计算,计算完再填回来。

出0入0汤圆

发表于 2014-5-27 11:45:04 | 显示全部楼层
还好是实现不了,我还以为楼主调试成功了呢。12,13,14楼的回答合起来已经很完整。

出0入0汤圆

发表于 2014-5-27 11:50:04 | 显示全部楼层
本帖最后由 xizi 于 2014-5-27 11:52 编辑

typedef __packed struct
{     
        U8 M_Model;      
        U8 M_Type;         
        U8 M_AddNo;      
        U8 M_Add[4];     
        U16 S_PowerNo;     
        U8 Check;
}sUseData;

sUseData   UseData;


void sum(void)
{
U8 i;
U8  *p;        
        UseData.Check = 0;
        p = (U8*)&UseData;
        for(i=0;i<sizeof(sUseData);i++){
                UseData.Check += *(p+i);        
        }
}

关键两点改动是:
1. typedef __packed struct
2. U8  *p;  p = (U8*)&UseData;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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