[問題] C用結構指標操作資料的問題

作者: amoumou (amoumou)   2018-12-13 21:21:28
開發平台(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應該會是多少?
2. TX_DATA透過轉型成結構指標操作的話,會不會有潛在的問題(例如沒對齊)?
3. 這樣的作法(轉型操作)是正確/常見的使用方式嗎?
剛入行對轉型跟結構還不太熟悉,希望各位前輩指導,非常感謝!
作者: james732 (好人超)   2018-12-13 21:31:00
sizeof()是compiler支援的而不是lib支援的吧?
作者: loveme00835 (髮箍)   2018-12-14 01:40:00
C89 就有 sizeof “operator” 除非你穿越吧
作者: amoumou (amoumou)   2018-12-14 08:07:00
謝謝指教!我馬上去確認sizeof()是否能用測試過了,編譯出現syntax error,無論是穿越或其他原因,現在我確實無法用sizeof()取得size第二題我想我有解答了,32位元不論哪種指標都是4bytes

Links booklink

Contact Us: admin [ a t ] ucptt.com