C_and_CPP 板


LINE

※ 引述《amoumou (amoumou)》之铭言: : 开发平台(Platform): : 我是在32Bit Renesas MCU上实作 : 我想要用结构指标来操作资料例如: : // MSB bit7 - bit0 LSB : // 要用来操作的结构 : typedef struct : { : uint8_t JoystickUpStatus:1; : uint8_t JoyStickLeftStatus:1; : uint8_t JoyStickRightStatus:1; : uint8_t JoyStickDownStatus:1; : uint8_t Pending1:4; : uint16_t TimeCounter1:12; : uint8_t Pending2:4 : uint16_t SpeedValue:16; : uint8_t XStatus:2; : uint8_t YStatus:2; : uint8_t Pending3:2; : uint16_t TimeCounter2:10; : uint8_t Pending4:8; : }MY_DAT_STRUCT; //8 bytes, 64bit total : uint64_t TX_DATA = 0xF0CCF03FFE000008; //通常资料一次送8 bytes出去 : MY_DAT_STRUCT *my_dat_struct = (MY_DAT_STRUCT *)&TX_DATA; : //以下为预期结果 : my_dat_struct->JoystickDownStatus 数值为 1; : my_dat_struct->SpeedValue 数值为 0x3FFE; : my_dat_struct->TimeCounter2 数值为 0xCCC; : 实际跑出来结果跟预期相符。 : 这样做的目的是希望增加程式的可读性,能明确的知道哪些bit是做甚麽用的; : 在读取的时候也能快速的取出要的数值。 : 我想问的问题是(我的lib中没有sizeof()可以用): : 1. 若我宣告 MY_DAT_STRUCT my_dat; my_dat的size会是连续的64bits吗? : 2. 承上,若宣告为 *my_dat; 那麽size应该会是多少? : 3. TX_DATA透过转型成结构指标操作的话,会不会有潜在的问题(例如没对齐)? : 4. 这样的作法(转型操作)是正确/常见的使用方式吗? 我做了一些测试跟爬文找到一些解答了。 首先上篇文章写到的实际跑出来的结果跟预期相符是错误的,实际上位置偏移了。 原本我预期MY_DAT_STRUCT的Size应该是8 Bytes, 但实际上却是10 Bytes,这与对齐的设定有关。 实际读取变成 JoyStickRightStatus = 0 JoyStickLeftStatus = 0 JoyStickRightStatus = 0 JoyStickDownStatus = 1 Pending1 = 0 TimeCounter1 = 0xE00 Pending2 = 0xf SpeedValue = 0xF03F XStatus = 0 YStatus = 0x3 Pending3 = 0 TimeCounter2 = 0x3C3 Pending4 = 0x5C 会造成这样的结果主要是没有设定对齐或是资料的排列没有最佳化,这个例子里因为没设定对齐方式, 预设会是自然对齐,也就是他会用结构内最大的uint16_t, 2bytes来对齐。 若我使用#pragma pack(1) 让他用 1Byte来对齐就会是我预期的 8 Bytes大小了。 要设定对齐我所知的有两种方式 1. 设定complier 2. 用#pragma pack(n) 关於我的第3个问题,我认为只要资料与结构的size及范围相符,用结构指标操作应该是没问题的。 第1及第4个问题我就不确定了;才疏学浅,以上若有错误的地方还拜托大家指正了,Thanks! --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.66.200.253
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1544773168.A.39A.html
1F:→ kokal: 1.从stack中分配sizeof(MY_DAT_STRUCT) 3.big/little Endia 12/16 22:46
2F:→ kokal: Endian, 4.如果真的确定一样的话, 我会用union 12/16 22:47
3F:→ amoumou: 非常感谢!Endian真是要注意的重点;我也会改用Union,比 12/17 21:21
4F:→ amoumou: 较能确定使用的是同一个空间。 12/17 21:21







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP