4

我有一个包含多个函数指针的结构。通用接口在头文件中创建。

头文件

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 等的函数指针基本相同,但我必须为每个新的结构接口单独写出它们。由于这是多余的,有没有办法让我只实现一次这些函数指针?

4

2 回答 2

1

标准解决方案是将结构指针作为第一个参数传递给函数。即代替:

I2C0.Start();

你写:

I2C0.Start(&I2C0);

然后,您可以在结构中添加一些额外的字段来识别它是哪一个(例如,如果您为每个 I2C 总线都有固定的硬件地址,您可能在结构的额外字段中拥有硬件地址)。

这是执行与 C++ 类等效的常规 C 方法。

于 2013-03-17T14:59:54.513 回答
0

你可以写一个构造函数。例子:

typedef struct{
     int    a;
     char   b;
}example;

void constructor (example *pointer_to_struct, int a_value, char b_value){
    pointer_to_struct->a = a_value;
    pointer_to_struct->b = b_value;   /*remember: if you have strings don't have any 
                                     assignments, since a string (like any other array) is a pointer to 
                                     its first element*/
}


int main (void){

    example ex_struct;
    constructor(&ex_struct, 10, 'C');

    return 0;
}

编辑:您还可以编写一个函数,为您选择的类型的每个结构进行相同的分配。例子:

void constructor(structure *p){
     p->a = 10;
     p->b = 'C';
}
于 2013-03-17T09:07:17.933 回答