在静态方法

时间:2017-02-12 18:06:18

标签: c++ visual-c++ mfc

我遇到了问题,如果你帮助我,我将非常感激。

我有一个MDI,在CDocument类中,我有一个结构:

CMyDoc.h

class CMyDoc : public CDocument
{
...

struct SRecord
{
    SRecord(){}
    virtual ~SRecord(){}
    CString sName;
    CString sState;
    CString sDateu;
    CString sDatec;
};

CTypedPtrArray<CPtrArray, SRecord*> m_arrRecord;

在某处我用数据加载这个结构:

    SRecord* pItem = new SRecord;
    pItem->sName        = saItem.GetAt(ML_ASSETNAME);
    pItem->sState       = saItem.GetAt(ML_STATE);
    pItem->sDateu       = saItem.GetAt(ML_DATEU;
    pItem->sDatec       = saItem.GetAt(ML_DATEC);
    m_arrRecord.Add(pItem);

确定。我正在尝试对数据进行排序:

void CMyDoc::SortData(int nColumn, BOOL bAscending)
{
switch(nColumn)
{
case 9:
    if(bAscending)qsort((void*)m_arrRecord.GetData(), m_arrRecord.GetSize(), sizeof(SRecord), CompareDateUAscending);
    else qsort((void*)m_arrRecord.GetData(), m_arrRecord.GetSize(), sizeof(SRecord), CompareDateUDescending);
    break;
...
}

问题在以静态方法访问数据时变为

int CMyDoc::CompareDateUDescending(const void* arg1, const void* arg2)
{
SRecord* Record1 = (SRecord*)arg1;
SRecord* Record2 = (SRecord*)arg2;

if(Record1->sDateu.IsEmpty() || Record2->sDateu.IsEmpty()) // <--- crash !
    return 0;

COleDateTime dL, dR;
dL.ParseDateTime(Record1->sDateu);
dR.ParseDateTime(Record2->sDateu);

return (dL == dR ? 0 : (dL < dR ? 1 : -1));
}

崩溃将我带到这里( atlsimpstr.h ):

CStringData* GetData() const throw()
{
    return( reinterpret_cast< CStringData* >( m_pszData )-1 );  // the crash lead me on this line 
}

我做错了什么?

非常感谢任何帮助!

更新

我试过这个:

int CMyDoc::CompareDateUDescending(const void* arg1, const void* arg2)
{
SRecord* Record1 = *(SRecord**)arg1;    // <-- OK
SRecord* Record2 = *(SRecord**)arg2;    // <-- Unhandled exception* see note below

if(Record1->sDateu.IsEmpty() || Record2->sDateu.IsEmpty())
    return 0;

COleDateTime dL, dR;
dL.ParseDateTime(Record1->sDateu);
dR.ParseDateTime(Record2->sDateu);

return (dL == dR ? 0 : (dL < dR ? 1 : -1));
}

崩溃告诉我:

&#34;在用户回调期间遇到未处理的异常。&#34;奇怪......

1 个答案:

答案 0 :(得分:1)

qsort比较函数接收指向数组中元素的指针。但由于数组中的元素本身就是指针,因为参数是指向SRecord指针的指针,即SRecord**

你可以通过举例来解决它。

const SRecord* Record1 = *reinterpret_cast<const SRecord**>(arg1);

也就是说,您将arg1转换为SRecord**,然后取消引用该指针以获取SRecord*

有关如何使用C++ standard sort function

的示例

首先,您需要稍微更新比较功能:

// The comparison function should return true if Record1 is *smaller* than Record2,
// and return false otherwise
bool CMyDoc::CompareDateUDescending(const SRecord* Record1, const SRecord* Record2)
{
    return Record1->sDateu < Record2->sDateu;
}

然后调用sort:

std::sort(m_arrRecord.GetData(), m_arrRecord.GetData() + m_arrRecord.GetSize(), CompareDateUDescending);

很多更简单!