头文件
typedef struct{ voID (*Start)(voID); voID (*ByteWrite)(uint8_t *pBuffer); // ModifIEs I2C buffer uint8_t (*ByteRead)(uint8_t *pBuffer); voID (*ArrayWrite)(uint8_t *pBuffer); uint8_t (*ArrayRead)(uint8_t *pBuffer); bool (*Busy)(voID);} sI2C_t;extern const sI2C_t I2C0;extern const sI2C_t I2C1;extern const sI2C_t I2C2;
然后在C文件中实现每个函数指针以满足结构接口.
C档案
static voID I2C0_Start(voID) { ... }static voID I2C0_ByteWrite(*uint8_t) { ... }static uint8_t I2C0_ByteRead(*uint8_t) { ... }static voID I2C0_ArrayWrite(*uint8_t) { ... }static uint8_t I2C_ArrayRead(*uint8_t) { ... }static bool I2C_Busy(voID) { ... }const sI2C I2C0 ={ I2C0_Start,I2C0_ByteWrite,I2C0_ByteRead,I2C0_ArrayWrite,I2C0_ArrayRead,I2C0_Busy};// Code-block repeated for I2C1,I2C2,etc. (REDUNDANT!)
这使得访问I2C接口特定功能变得相对容易:
bool status;I2C0.Start();status = I2C1.Busy();...
虽然函数指针对于I2C0,I2C1和I2C2等基本相同,但我必须为每个新的结构接口单独写出它们.由于这是多余的,我有没有办法只实现一次这些函数指针?
解决方法 标准解决方案是将结构指针作为第一个参数传递给函数.即代替:I2C0.Start();
你写:
I2C0.Start(&I2C0);
然后,您可以向结构添加一些额外字段以标识它是哪一个(例如,如果每个I2C总线都有固定的硬件地址,则可能在结构的额外字段中具有硬件地址).
这是执行C类等效的常规C方式.
总结以上是内存溢出为你收集整理的每个结构调用使用一次的结构函数指针全部内容,希望文章能够帮你解决每个结构调用使用一次的结构函数指针所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)