C_and_CPP 板


LINE

该睡了但还没睡意,用最简单的方式实作一下 这种做法完全不支援多重继承,不过应该可以达到原本的需求 ==== 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







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灯, 水草

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

TOP