18C语言提高深入浅出day7—03回调函数案例-实现对任意数据类型排序

提供一个函数,可以对任意类型的数据进行排序,排序规则 选择排序

阅读本代码之前,先要复习一下选择排序。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void selectSort(void *arr, int eleSize, int len,
                int (*myCompare)(void *, void *)) {
    int i, j;
    char *temp = malloc(eleSize);
    int MinOrMax;
    for (i = 0; i < len; i++) {
        MinOrMax = i;//定义最小值或者最大值下标
        for (j = i + 1; j < len; j++) {

//j下标的数据地址
            char *pJ = (char *)arr + j * eleSize;
            char *pMinOrMax = (char *)arr + MinOrMax * eleSize;
            if (myCompare(pJ, pMinOrMax)) {
                MinOrMax = j;//更新 真实最小值 或者 最大值的下标
            }
            //if(arr[j] < arr[MinOrMax])
        }

        if (i != MinOrMax) {
        //交换数据
            char *pI = (char *)arr + i * eleSize;
            char *pMinOrMax = (char *)arr + MinOrMax * eleSize;

            memcpy(temp, pI, eleSize);
            memcpy(pI, pMinOrMax, eleSize);
            memcpy(pMinOrMax, temp, eleSize);
        }
    }

    if (temp != NULL) {
        free(temp);
        temp = NULL;
    }
}
int myCompareInt(void *data1, void *data2) {
    int *num1 = data1;
    int *num2 = data2;
//if(*num1 < *num2)
//{return 1;
//}
//return 0;
    return *num1 < *num2;
}

void test01() {
    int i;
    int arr[] = {10, 40, 30, 20, 50};
    int len = sizeof(arr) / sizeof(int);
    selectSort(arr, sizeof(int), len, myCompareInt);
    for (i = 0; i < len; i++) {
        printf("%d\n", arr[i]);
    }
}
struct Person {
    char name[64];
    int age;
};

int myComparePerson(void *data1, void *data2) {
    struct Person *p1 = data1;
    struct Person *p2 = data2;
//按照年龄 进行从大到小 降序
    return p1->age > p2->age;
}

void test02() {
    int i;
    struct Person pArray[] = {
        {"aaa", 10}, {"bbb", 60}, {"ccc", 20}, {"ddd", 40}, {"eee", 30}, };
    int len = sizeof(pArray) / sizeof(struct Person);
//按照年龄实现从大到小排序
    selectSort(pArray, sizeof(struct Person), len, myComparePerson);

    for (i = 0; i < len; i++) {
        printf("name=%s, age=%d\n", pArray[i].name, pArray[i].age);
    }
}

int main() {
   // test01();
  test02();
    return 0;
}
### 如何使用 Keil5 Hex 文件 对于仅拥有已编译好的 hex 文件而无源文件的情况,在 Keil V5 平台上直接hex 文件至单片机(如华大单片机)需采取特定的方法,因为直接调用该平台进行此类操作不可行[^1]。 #### 设置 Output 路径 进入 Keil 的 output 设置界面,指定要录的 hex 文件的具体位置。确保在路径输入框中填完整的 hex 文件名称并附带 `.hex` 扩展名;缺少此扩展名可能导致系统继续尝试录先前编译的结果而非所选的 hex 文件[^3]。 #### 配置 Flash 工具选项 针对不同类型的微控制器(MCU),可能还需调整 flash 下载工具的相关配置参数以匹配目标设备的要求。这一步骤通常涉及选择合适的编程算法以及设定通信接口等细节[^2]。 #### 启动下载过程 完成上述准备工作之后,可以通过点击调试窗口内的 “Download” 或者快捷菜单里的相应命令来启动实际的程序入流程。如果一切顺利的话,软件会自动连接硬件并将选定的 hex 数据传输到 MCU 中存储起来[^4]。 ```python # Python 示例代码用于说明自动化脚本概念 (并非真实实现) def download_hex_to_mcu(hex_file_path, mcu_type): """ 自定义函数模拟将 HEX 文件下载到指定型号的 MCU 上 参数: hex_file_path -- 完整路径字符串指向待上传的 .hex 文件 mcu_type -- 字符串表示的目标单片机类型标识符 返回值: 成功则返回 True ,失败抛出异常信息 """ try: configure_output_settings(hex_file_path) # 设定输出设置 select_flash_tool(mcu_type) # 挑选适合的闪存工具 execute_download_command() # 发送下载指令 return True # 表明成功结束 except Exception as e: raise RuntimeError(f"Failed to upload {hex_file_path}: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值