结构体常见操作

#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;
}

<think>好的,我现在需要处理用户关于MFC结构体链表操作的问题。用户提到了引用中的结构体示例和链表代码,但引用中的代码似乎是用C语言和标准库实现的,而用户需要的是MFC相关的示例。MFC通常使用C++,并且可能有不同的链表实现方式,比如使用C++的STL或者MFC的集合类。 首先,我需要确认用户的需求:他们想在MFC环境中操作结构体链表。可能的思路是结合结构体和STL的链表容器,比如std::list,因为MFC本身也支持C++标准库。引用中的ManualMedicine结构体已经使用了std::list<preMedInfo>,这可能是一个合适的例子。接下来,我应该考虑如何将结构体与链表操作结合起来。例如,定义结构体,然后使用std::list来存储这些结构体实例,并展示基本的操作如添加、遍历、删除等。同时,用户可能需要看到如何在MFC的界面中应用这些操作,比如在列表控件中显示链表数据。另外,用户提到的引用3中的C语言链表代码,可以转换为C++中使用指针链表的方式,但考虑到MFC和现代C++的特性,使用STL容器可能更安全和方便。因此,示例代码可能更倾向于使用std::list而不是手动管理指针。 需要注意MFC中常见的做法,比如使用CString而不是std::string,但用户提供的结构体示例中使用了std::string,所以可能需要说明两者都可以使用,或者根据情况调整。同时,MFC的对话框或文档/视图结构中如何集成这些数据结构也是需要考虑的部分。 最后,生成相关问题时要围绕结构体链表在MFC中的操作,可能的优化、遍历方法、界面绑定等。需要确保引用标记正确,比如引用[1]中的结构体示例和引用[3]中的链表操作代码,但指出如何适应MFC环境。</think>### MFC结构体链表操作示例 在MFC中操作结构体链表通常结合C++标准库的`std::list`容器实现。以下示例基于引用[1]的结构体定义,展示链表的增删改查操作: #### 1. 结构体定义(参考引用[1]) ```cpp #include <list> #include <string> using namespace std; struct preMedInfo { int medId; string medName; string medNum; string medUnit; }; ``` #### 2. 链表初始化与添加元素 ```cpp std::list<preMedInfo> lstMedicine; // 添加元素 preMedInfo newItem; newItem.medId = 1001; newItem.medName = "阿司匹林"; lstMedicine.push_back(newItem); ``` #### 3. 遍历链表(使用迭代器) ```cpp for (auto it = lstMedicine.begin(); it != lstMedicine.end(); ++it) { CString strInfo; strInfo.Format(_T("药品ID:%d 名称:%s"), it->medId, CString(it->medName.c_str())); AfxMessageBox(strInfo); // MFC弹窗显示 } ``` #### 4. 删除元素 ```cpp auto it = lstMedicine.begin(); while (it != lstMedicine.end()) { if (it->medId == 1001) { it = lstMedicine.erase(it); // 删除指定ID元素 } else { ++it; } } ``` #### 5. 修改元素(参考引用[1]反向迭代器) ```cpp if (!lstMedicine.empty()) { auto rit = lstMedicine.rbegin(); // 反向迭代器 rit->medName = "修改后的名称"; // 修改最后一个元素 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值