如何对指向具有名称的位置的 void* 数组进行排序?
How do a sort a array of void* that points to places with names?
基本上有长方形(建筑物)和圆形(人)。
我需要做的任务基本上是,当函数“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", i, 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);
}
基本上有长方形(建筑物)和圆形(人)。
我需要做的任务基本上是,当函数“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", i, 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);
}