结构体常见操作

#include <stdio.h>
#include <stdlib.h>

#define STR "string_test"

struct inv_ixm42xxx_serif {
        int   (*read_reg)(struct inv_ixm42xxx_serif * serif, int reg, int * buf, int len);
        int   (*write_reg)(struct inv_ixm42xxx_serif * serif, int reg, const int * buf, int len);
        int   (*configure)(struct inv_ixm42xxx_serif * serif);
        int   max_read;
        int   max_write;
        char  str[20];
};

struct inv_ixm42xxx_transport {
        char str[20];
        int gr;
        struct inv_ixm42xxx_serif *serif;//pointer
        struct inv_ixm42xxx_serif serif1;//instance
};

static int iim_42652_read_reg(struct inv_ixm42xxx_serif *serif, int reg, int *buf, int len)
{
        printf("read_reg test");
        return 1;
}

static int iim_42652_write_reg(struct inv_ixm42xxx_serif *serif, int reg, const int *buf, int len)
{
        printf("write_reg test");
        return 2;
}

struct inv_ixm42xxx_serif my_serif = {
        .read_reg = iim_42652_read_reg,
        .write_reg = iim_42652_write_reg,
        .max_read = 1,
        .max_write = 2,
        .str = STR,
};
//struct inv_ixm42xxx_serif *p_my_serif = &my_serif;

struct inv_ixm42xxx_transport trans_const = {
        .str = STR,
        .gr = 70,
        .serif = &my_serif,
        .serif1 = {
                .read_reg = iim_42652_read_reg,
                .write_reg = iim_42652_write_reg,
                .max_read = 12,
                .max_write = 23,
        },
};
//struct inv_ixm42xxx_transport *p_g_trans = &trans_const;

struct inv_ixm42xxx_transport *get_inv_ixm42xxx_trans(struct inv_ixm42xxx_transport *p_trans)
{
        return p_trans;
}

struct inv_ixm42xxx_serif *get_inv_ixm42xxx_serif(struct inv_ixm42xxx_transport *p_trans)
{
        return p_trans->serif;
}

struct inv_ixm42xxx_serif *get_inv_ixm42xxx_serif1(struct inv_ixm42xxx_serif *p_serif)
{
        return p_serif;
}

struct inv_ixm42xxx_serif get_inv_ixm42xxx_serif1_1(struct inv_ixm42xxx_transport *p_trans)
{
        return p_trans->serif1;
}

static void p_func_run(struct inv_ixm42xxx_serif (*pfunc_run)(struct inv_ixm42xxx_serif *serif), struct inv_ixm42xxx_serif *serif_a)
{
        pfunc_run(serif_a);
}

struct inv_ixm42xxx_serif get_inv_ixm42xxx_serif1_1_1(struct inv_ixm42xxx_serif *p_serif)
{
        int ret = -1;

        printf("p_func: serif->max_read = %d\n", p_serif->max_read);
        printf("p_finc: serif->max_write = %d\n", p_serif->max_write);
        printf("p_finc: serif->str = %s\n", p_serif->str);

        return *p_serif;
}

#if 0
static void p_func_run(struct inv_ixm42xxx_serif *(*pfunc_run)(struct inv_ixm42xxx_transport *serif), struct inv_ixm42xxx_transport *trans_a)
{
        pfunc_run(trans_a);
}

//struct nv_ixm42xxx_serif (*p_func_serif)(struct inv_ixm42xxx_serif *);
struct inv_ixm42xxx_serif get_inv_ixm42xxx_serif1_1_1(struct inv_ixm42xxx_serif *p_serif)
{
        int ret = -1;

        printf("p_func: serif->max_read = %d\n", p_serif->max_read);
        printf("p_finc: serif->max_write = %d\n", p_serif->max_write);

        return *p_serif;
}
#endif

int main()
{
        struct inv_ixm42xxx_transport *trans;
        struct inv_ixm42xxx_transport trans1;
        struct inv_ixm42xxx_serif *serif;
        struct inv_ixm42xxx_serif serif1;
        int ret = 10;
        int buf[2];
        int i = 0;

        struct inv_ixm42xxx_serif *(*_pfunc_run)(struct inv_ixm42xxx_serif *serif);//func pointer, and return struct pointer


        i++;
//return pointer <*>
        printf("%d\n", i++);
        //trans = get_inv_ixm42xxx_trans(p_g_trans);
        trans = get_inv_ixm42xxx_trans(&trans_const);
        printf("trans->serif->max_read = %d\n", trans->serif->max_read);
        printf("trans->serif->max_write = %d, trans->str = %s\n", trans->serif->max_write, trans->str);
        ret = trans->serif->write_reg(serif, 32, buf, 1);
        printf("ret = %d\n", ret);

        printf("%d\n", i++);
        //serif = get_inv_ixm42xxx_serif(p_g_trans);
        serif = get_inv_ixm42xxx_serif(&trans_const);
        printf("serif->max_read = %d\n", serif->max_read);
        printf("serif->max_write = %d\n", serif->max_write);
        ret = serif->read_reg(serif, 32, buf, 1);
        printf("ret = %d\n", ret);

        printf("%d\n", i++);
        //serif = get_inv_ixm42xxx_serif1(p_my_serif);
        serif = get_inv_ixm42xxx_serif1(&my_serif);
        printf("serif->max_read = %d\n", serif->max_read);
        printf("serif->max_write = %d\n", serif->max_write);

//return instance <struct xxx>
#if 1 //Usful for G-sensor
        printf("%d\n", i++);
        serif1 = get_inv_ixm42xxx_serif1_1(&trans_const);
        //serif1 = get_inv_ixm42xxx_serif1_1(p_g_trans); //Test OK
        printf("serif->max_read = %d\n", serif1.max_read);
        printf("serif->max_write = %d\n", serif1.max_write);
        ret = serif1.read_reg(&serif1, 32, buf, 1);
        printf("ret = %d\n", ret);
#endif
#if 1
        p_func_run(get_inv_ixm42xxx_serif1_1_1, &my_serif);
#endif


        printf("test done\n");

        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值