PtrArray 的 qsort排序为何不成功?

请教大神,我调试了一晚上都查不出问题来。

PtrArray2.h 文件

 #pragma once
#include "afxcoll.h"

typedef int (__cdecl *GENERICCOMPAREFN)(const void * elem1, const void * elem2);
typedef int (__cdecl *STRINGCOMPAREFN)(const void ** elem1, const void ** elem2);

class CPtrArray2 :
    public CPtrArray
{
public:
    CPtrArray2(void);
    ~CPtrArray2(void);

public:
    void Sort(STRINGCOMPAREFN pfnCompare = Compare);

protected:
    static int __cdecl Compare(const void ** pstr1, const void ** pstr2);

};


PtrArray2.cpp

 #include "stdafx.h"
#include "PtrArray2.h"


CPtrArray2::CPtrArray2(void)
{
}


CPtrArray2::~CPtrArray2(void)
{
}

int CPtrArray2::Compare(const void ** pstr1, const void ** pstr2)
{
    ASSERT(pstr1);
    ASSERT(pstr2);
    int n1 = (**((int **)pstr1));
    int n2 = (**((int **)pstr2));
    return n1 < n2;
    //return (**((int **)pstr1)) > (**((int **)pstr2));
}

void CPtrArray2::Sort(STRINGCOMPAREFN pfnCompare /*= CSortedStringArray::Compare */)
{
    void ** prgstr = GetData();
    int nSize = GetSize();
    qsort(prgstr, GetSize(), sizeof(void *),(GENERICCOMPAREFN)pfnCompare);
}

主程序.cpp中调用


    srand( (unsigned)time( NULL ) ); // Generate seed for rand().
    CPtrArray2 arr;
    int *ptr = NULL;
    for (int i=0; i< 10;i++)
    {       
        int n = rand();
        int *p = new int(n);
        arr.Add( p );
        TRACE("%d------->%d\n",p, *p);
    }
    TRACE("\n\n");
    long ltim=GetTickCount();
    arr.Sort();
    for (int i=0; i< 10;i++)
    {
        TRACE("%d--------->%d\n", arr[i], (*(int *)(arr[i])));
    }

    TRACE("Time took= %li\n", GetTickCount()-ltim);

结果没能正确排序,请问是什么原因呢?

3个回答

那个不是 PtrArray 的,可以解释一下我程序不能排序的原因吗?谢谢

哦,我知道了,是compare函数返回值的问题,换成
if (n1 < n2)
return -1;
else if (n1 > n2)
return 1;
return 0;
就可以了,谢谢了呀

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!