楼主:
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的情况)?
请各位赐教。感谢。
转型回去I2C_Device_ADXL345就可以了吧?
作者:
pttworld (批踢踢世界)
2016-10-11 18:23:00被问题电到。
为什么要用这种方法设rawData,realData的值阿?这种写法不好maintain吧
作者:
firejox (Tangent)
2016-10-11 18:47:00转回去就好而且以标准来说 那样算不见得正确
作者:
chuegou (chuegou)
2016-10-11 18:56:00我会这样写type define时 里面的引数用void用void*
请问data_func到底是传什么物件进去? 为啥说可以转回去
作者:
firejox (Tangent)
2016-10-11 19:57:00不会有alignment 的问题 位址是一样的
作者:
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:00I2C_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
哇赛真是个酷炫的玩意儿开眼界了