[問題] struct轉型的問題

作者: wtchen (沒有存在感的人)   2016-10-11 17:47:13
(板工以身作則來示範怎麼被電)
開發平台(Platform): (Ex: Win10, Linux, ...)
Raspbien + kernel 4.4
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
gcc 4.9.2-10
編譯參數:-Wall -pedantic -O3 -std=gnu11
問題(Question):
正在研究如何用struct做簡單的物件。
我有一個物件 I2C_Device
typedef struct __I2C_Device {
int (*init_func)(struct __I2C_Device* dev);
int (*data_func)(struct __I2C_Device* dev);
} I2C_Device ;
性質是I2C_Device 的物件很多,比如其中一個元件
typedef struct {
I2C_Device dev;
int16_t rawData[3]; // 這兩個元件每一個I2C_Device的物件
float realData[3]; // 不相同,所以不能包在I2C_Device裡
} I2C_Device_ADXL345;
I2C_Device_ADXL345* adxl345
= (I2C_Device_ADXL345*)malloc(sizeof(I2C_Device_ADXL345));
如果我需要用 adxl345->dev.data_func 去修改adxl345->rawData跟realData
我可以怎麼寫?
例如
(int16_t*)((I2C_Device*) adxl345+1)[1] = 2 ; // 設定rawData[1];
(float*)((int16_t*)((I2C_Device*) adxl345+1)+3) = 2 ; // 設定realData[0];
(可是我怕這種寫法會因為alignment的關係得到不正確的結果)
還是有別的更好作法(只能用C的情況)?
請各位賜教。感謝。
作者: grayStone (灰色石頭)   2016-10-11 18:07:00
轉型回去I2C_Device_ADXL345就可以了吧?
作者: pttworld (批踢踢世界)   2016-10-11 18:23:00
被問題電到。
作者: boss0405 (boss)   2016-10-11 18:39:00
為什麼要用這種方法設rawData,realData的值阿?這種寫法不好maintain吧
作者: firejox (Tangent)   2016-10-11 18:47:00
轉回去就好而且以標準來說 那樣算不見得正確
作者: chuegou (chuegou)   2016-10-11 18:56:00
我會這樣寫type define時 裡面的引數用void用void*
作者: lovejomi (JOMI)   2016-10-11 19:57:00
請問data_func到底是傳什麼物件進去? 為啥說可以轉回去
作者: firejox (Tangent)   2016-10-11 19:57:00
不會有alignment 的問題 位址是一樣的
作者: lovejomi (JOMI)   2016-10-11 19:58:00
如果強轉傳進去 為什麼不能強轉回來?
作者: Eleina (艾琳娜)   2016-10-11 20:21:00
不介意 instance 的 size 大一點的話用 union
作者: wtchen (沒有存在感的人)   2016-10-11 20:37:00
這個case用union的意義是?
作者: Eleina (艾琳娜)   2016-10-11 21:31:00
I2C_Device1_t, I2C_Device2_t ... 變成 union memberdev.type1, dev.type2 可以對應到不同結構定義
作者: wtchen (沒有存在感的人)   2016-10-11 21:37:00
這裡不太適合,因為I2C_Device可以生成多個子物件(就是說可以被繼承),至於被繼承後多了啥物件很難預測
作者: pttworld (批踢踢世界)   2016-10-12 15:47:00
文標提到轉型,題目使用箭頭,例如卻進行高風險語法。
作者: Davidhu127 (船船_BTTO)   2016-10-13 05:59:00
哇賽真是個酷炫的玩意兒開眼界了

Links booklink

Contact Us: admin [ a t ] ucptt.com