首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何对泛型(void*)数组进行排序?

如何对泛型(void*)数组进行排序?
EN

Stack Overflow用户
提问于 2020-07-08 04:41:19
回答 2查看 283关注 0票数 1

有一个传入类型为void*的数组。我想对数组进行排序,但我需要能够创建一个临时值来切换数组的各个部分。我该怎么做呢?

因此,我使用memcpy在下面的代码中切换值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
memcpy(temp, first, size);
memcpy(first, cur, size);
memcpy(cur, temp, size);

在这里我尝试切换第一个和cur元素。(是的,它们是指针)。是这样的吗?因为我的程序出现了错误,尽管我不确定是不是因为这个。(错误如不准确的输出。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-08 06:44:43

你的实现是可以的,但是关于你的comment,你的函数装饰应该是,像;

编辑:"l“替换为"byteLength”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void swap(void *a, void *b, size_t byteLength) {
    void *tmp = malloc(byteLength);

    memcpy(tmp, a, byteLength);
    memcpy(a, b, byteLength);
    memcpy(b, tmp, byteLength);

    free(tmp);
    return;
}

并且,如果您要交换字符串(即(char *)指针);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void swap(void **a, void **b) {
    void *tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;

    return;
}

...
...

{
    char *a = "some string";
    char *b = "some other string";
    ...
    ...

    // somewhere in the calling function
    swap(&a, &b);
}
票数 0
EN

Stack Overflow用户

发布于 2020-07-08 06:54:21

它是泛型编程的核心。如果你想对一个void*指针数组进行排序(每个指针可以指向任何数据类型,通常是它的用户定义的结构),你需要一个相等函数/函数指针。让我们假设我们有如下结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct
    int foo;
    ....
    ....
    
}s_ex;

我们通过在堆上分配每个结构来初始化s_ex结构的数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 void* arr[];

我们希望将这个void*指针数组传递给排序函数,可以对任何数据类型进行排序的泛型函数:

函数签名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void gen_sort(void **user_array,int n, int(*fp_equality)(void*,void*));

唯一知道如何比较两个项的人是调用者(构建这些数据类型的人)!因此,他需要传递一个函数fp_equality,该函数知道如何比较两个项目并以int (如strcmp)的形式返回结果。

排序的算法不是问题,你可以决定哪种排序算法适合你的程序。为了简单起见,我采用冒泡排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void gen_sort(void **user_array,int n; int(*fp_equality)(void*,void*))
{
    int i, j;  
    for (i = 0; i < n-1; i++)      
      
    // Last i elements are already in place  
    for (j = 0; j < n-i-1; j++)
        if(fp_equality(arr[j],arr[j+1])>0)   /*like: (arr[j] > arr[j+1])*/    
            swap(&arr[j], &arr[j+1]);  
}  

void swap(void** lhs, void** rhs)
{
    void* temp = *lhs;
    *lhs=*rhs;
    *rhs=temp;
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62787675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文