作者asilzheng (asil)
看板C_and_CPP
标题Re: [问题] struct转型的问题
时间Wed Oct 12 01:11:07 2016
该睡了但还没睡意,用最简单的方式实作一下
这种做法完全不支援多重继承,不过应该可以达到原本的需求
==== I2CDevice.h ====
typedef struct __I2C_Device I2C_Device;
struct __I2C_Device {
int (*init_func)(I2C_Device *dev);
int (*data_func)(I2C_Device *dev);
};
int I2CDevInitFn(I2C_Device *dev);
int I2CDevDataFn(I2C_Device *dev);
==== I2CDevice.c ====
#include "I2CDevice.h"
int I2CDevInitFn(I2C_Device *dev) {
return dev->init_func(dev);
}
int I2CDevDataFn(I2C_Device *dev) {
return dev->data_func(dev);
}
==== I2C_ADXL345.h ====
#include "I2C_Device.h"
typedef struct __I2C_ADXL345 I2C_ADXL345;
I2C_ADXL345 *I2CAdxl345New();
==== I2C_ADXL345.c ====
struct __I2C_ADXL345 {
I2C_Device dev;
int16_t rawData[3];
fload realData[3];
};
static int __Adxl345InitFn(I2C_Device *dev) {
I2C_ADXL345 *adxl345 = (I2C_ADXL345 *)dev;
// TODO: do something
}
static int __Adxl345DataFn(I2C_Device *dev) {
I2C_ADXL345 *adxl345 = (I2C_ADXL345 *)dev;
// TOOD: do something
}
I2C_Device_ADXL345 *I2CDevAdxl345New() {
I2C_ADXL345 *adxl345 = (I2C_ADXL345 *)malloc(sizeof(I2C_ADXL345);
adxl345->dev.init_func = &__Adxl345InitFn;
adxl345->dev.data_func = &__Adxl345DataFn;
}
==== main.c ====
#include "I2C_ADXL345.h"
int main (int argc, char **argv) {
I2C_ADXL345 *adxl345 = I2CDevAdxl345New();
I2CDevInitFn((I2C_Device *)adxl345);
I2CDevDataFn((I2C_Device *)adxl345);
return 0;
}
※ 引述《wtchen (没有存在感的人)》之铭言:
: (板工以身作则来示范怎麽被电)
: 开发平台(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的情况)?
: 请各位赐教。感谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.137.193.214
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1476205869.A.A39.html
1F:→ wtchen: 你的架构比我想的简洁一些,感谢。 10/12 02:13
2F:推 wtchen: 不过这样的作法就是要多加一个能free I2C_Device_ADXL345 10/12 02:39
3F:→ wtchen: 的函式。 10/12 02:40
4F:推 wtchen: 我就是想达到这样的效果,然後可以把实作跟宣告分开 10/12 03:54
5F:→ asilzheng: free一样做成func pointer在new时指定即可 10/12 06:50
6F:推 wtchen: 不行吧?这样不是free掉自己? 10/12 14:51
7F:→ asilzheng: 就和data_fun一样的方式,然後通通用I2CDevFreeFn解构 10/12 19:52
8F:推 wtchen: 我懂了 感谢 10/12 20:07
※ 编辑: asilzheng (114.36.115.215), 10/12/2016 21:10:44