微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何对指向带有名称的地方的 void* 数组进行排序?

如何解决如何对指向带有名称的地方的 void* 数组进行排序?

基本上有矩形(建筑物)和圆形(人)。

我需要做的任务基本上是,当一个函数“fg”被调用时,给定半径内的每个圆都需要跑到最近的矩形,在半径内的所有圆找到一个矩形后,我需要在 .txt 文件中报告按字母顺序排列的每个矩形的圆的名称

例如:

矩形A: c1 c2 c3

矩形 B: c7 c11 c20

...

等等...

我需要将运行的圆的地址存储在每个矩形的向量上。 我尝试使用 stdlib.h 中的 qsort,但也许我用来比较的函数错误

(编辑 - 完整代码以更好地理解):

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

typedef struct wow{
    char* name;

}wow_t;

const char* getName(const void* pointer){
    const wow_t* aux = pointer;
    return aux->name;
}

int myCompare(const void* a,const void* b) {
    // setting up rules for comparison
    const char* temp1 = getName(a);
    const char* temp2 = getName(b);
    return strcmp(temp1,temp2);

}


int main() {
    
    wow_t temp[5];

    for(int i = 0; i < 5; i++){
        temp[i].name = calloc(30,1);
    }

    strcpy(temp[0].name,"Joe");
    strcpy(temp[1].name,"Daniel");
    strcpy(temp[2].name,"Rhuan");
    strcpy(temp[3].name,"Drake");
    strcpy(temp[4].name,"Peter");

    void* aux[5];
    
    for(int i = 0; i < 5; i++){
        aux[i] = &temp[i];
    }   
    puts("Before: ");
    for(int i = 0; i < 5; i++){
        printf("aux[%d] = %s\n",i,getName(aux[i]));
    }   


    qsort(aux,5,sizeof(const void*),myCompare);

    puts("After: ");
    for(int i = 0; i < 5; i++){
        printf("aux[%d] = %s\n",getName(aux[i]));
    }  

}

解决方法

第三个参数需要是实际数组元素的大小:

qsort(aux,5,sizeof *aux,myCompare);

此外,由于您的数组元素是 void * 类型,因此传递给比较函数的指针是指向它们的指针。所以你想要:

int myCompare(const void* a,const void* b) {
    // setting up rules for comparison
    const char* temp1 = getName(*(const void **)a);
    const char* temp2 = getName(*(const void **)b);
    return strcmp(temp1,temp2);

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。