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;
}