我陷入了一个问题,如果您能帮助我,我将不胜感激。

我有一个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));
}


坠机告诉我:

“在用户回调期间遇到未处理的异常。”奇怪的...

最佳答案

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


简单得多!

关于c++ - 静态方法上使用的CString,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42191235/

10-09 00:19