C++ 处理指针的Qsort
我在C++ 处理指针的Qsort,c++,pointers,qsort,C++,Pointers,Qsort,我在qsort方面遇到了麻烦,如果有人能帮助我,我将不胜感激 此外,在询问之前,我已经搜索了很多,但没有成功 下面是我的程序的大致设置: ~h~ ~cpp~ void update(...){ playerClass *p = new playerClass( ); ... for (int i = 0; i < count; i++){ ... ar[j]->average = (ar[j]->hits)/(ar[j]-
qsort
方面遇到了麻烦,如果有人能帮助我,我将不胜感激
此外,在询问之前,我已经搜索了很多,但没有成功
下面是我的程序的大致设置:
~h~
~cpp~
void update(...){
playerClass *p = new playerClass( );
...
for (int i = 0; i < count; i++){
...
ar[j]->average = (ar[j]->hits)/(ar[j]->atBats);
cout << "Average: " << ar[j]->average << endl;
/* Prints Averages correctly, but I need everything to be sorted by
the Averages, and I am instructed to use qsort */
qsort(*ar, count, sizeof(playerClass*), compare);
cout << "Sorted average: " << ar[j]->average << endl;
}
}
int compare (const void *a, const void *b){
playerClass *x = (playerClass*)a;
playerClass *y = (playerClass*)b;
/* I believe that I'm not correctly accessing the Averages with
the two statements above, I have tried many different variations
of them, but I am not actually able to access the averages correct.
Can someone please help me, so that way I can get over this obstacle
and continue this assignment? */
if (x < y) return -1;
if (x > y) return 1;
return 0;
}
void更新(…){
playerClass*p=新的playerClass();
...
for(int i=0;i平均=(ar[j]->点击次数)/(ar[j]->atBats);
是否要替换compare
函数中的这两行:
playerClass *x = (playerClass*)a;
playerClass *y = (playerClass*)b;
与
因为您使用的是x
和y
来比较平均值,而不是进行交换。当您将指向类的指针指定给x
和y
时,您将比较它们的指针-因此您的排序以“它们在内存中的放置顺序”结束-这不太可能是您想要的顺序
update这是一个非常简单的程序,它创建了一个类、该类的元素数组和指向元素的指针数组。它使用指针数组调用qsort
,并演示了原始数组的排序结果
看看这对你是否有帮助
#include <stdio.h>
#include <stdlib.h>
class playerClass {
public:
double average;
};
// some values for initialization
double values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return (((playerClass*)a)->average - ((playerClass*)b)->average);
}
int main ()
{
int ii;
playerClass b[6]; // create 6 elements of the "class"
playerClass *a[6]; // create pointers to the elements
for(ii=0; ii<6; ii++) {
b[ii].average = values[ii]; // put values in the elements
a[ii] = &b[ii]; // make the pointers point to sensible things
}
qsort (a[0], 6, sizeof(playerClass), compare); // perform qsort
// and print results:
for (ii=0; ii<6; ii++)
printf ("%.0f ",b[ii].average);
printf("\n");
return 0;
}
PS如果这看起来像C,我很抱歉。它是,除了类
定义。我本可以将struct
用于这种(无函数)类,它也会以同样的方式工作
PPS-你本可以做到的
qsort(b, 6, sizeof(playerClass), compare);
而且它也同样有效
我认为您的问题在于,您仍然在尝试对指针大小的对象进行排序,而指针大小应该是整个类对象的大小
所以我认为
是解决这个问题的方法(我刚刚注意到在你的一次编辑中,你去掉了一行,上面写着playerClass*ar[N];
…)
旁注
如果你编辑问题以加入关于错误的建议,那么很难找到答案
“正如@JohnDoe所指出的,我应该用ar
而不是*ar
。所以我把我的代码改为..
,现在的问题是..
对于那些关注问题一段时间并试图帮助你找到答案的人来说,这真的很有帮助
否则,我们必须查看编辑历史以了解发生了什么。有意义吗?除了@Floris answer,您还应该将qsort
移动到循环之外。否则,您将不必要地对数组进行多次排序
您还必须提供ar
的地址,而不是第一个元素
for (int i = 0; i < count; i++) {
...
}
qsort(ar, count, sizeof(ar[0]), compare);
或正确的类型playerClass*
qsort(ar, count, sizeof(playerClass*), compare);
更新:
第三次尝试,您希望对指针数组进行排序
- 如上所述,您必须为qsort的size参数提供
sizeof(playerClass*)
- 比较函数的参数是指向元素的指针,在本例中是指向
playerClass
的指针
int compare(const void *a, const void *b)
{
playerClass *x = *(playerClass**)a;
playerClass *y = *(playerClass**)b;
if (x->average < y->average)
return -1;
if (x->average > y->average)
return 1;
return 0;
}
int比较(常量无效*a,常量无效*b)
{
playerClass*x=*(playerClass**)a;
playerClass*y=*(playerClass**)b;
如果(x->averageaverage)
返回-1;
如果(x->平均值>y->平均值)
返回1;
返回0;
}
C++有很多漂亮的,比C++的函数更适合C++的。比如,我建议你读一下。也请注意,<代码> AR <代码>是一个指针数组,这意味着<代码> *AR <代码>不会按你的期望去做。我也建议你阅读关于.jaajimiRiBrg的意见。"被要求使用qsort
…嗨,Floris,这对我来说很有意义,我很感激。我接受了你的建议,但我的程序seg出现了故障,我通过将qsort的第一个参数从*ar改为简单的ar来修复。至少,它现在可以编译,与未排序的平均值不同,但它仍然没有按升序或降序排序r、 有什么想法吗?你能使用qsort
吗?试着用一个简单的双精度数组,确保你能在这样复杂的事情发生之前完成它。我经常发现,小步走就能找到答案。双精度数组->结构数组->类数组将是我慢慢让问题变得更难的方法;然后当它崩溃时,我有办法缩小它的范围。如果上述内容还不够的话,如果你能展示更多的代码,这将是很有帮助的-例如,ar
中的值是如何初始化的,以及你如何打印出它们的“排序”值。换句话说,一个更完整的程序。通常“问题在于你没有展示的代码”是的,我只是把注意力集中在问题的“我访问的平均值是错误的”部分,但你在这方面是绝对正确的。
qsort(ar, count, sizeof(playerClass), compare);
for (int i = 0; i < count; i++) {
...
}
qsort(ar, count, sizeof(ar[0]), compare);
qsort(ar, count, sizeof(ar[0]), compare);
qsort(ar, count, sizeof(playerClass*), compare);
int compare(const void *a, const void *b)
{
playerClass *x = *(playerClass**)a;
playerClass *y = *(playerClass**)b;
if (x->average < y->average)
return -1;
if (x->average > y->average)
return 1;
return 0;
}