c++ - CString 用于静态方法

标签 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));
}

崩溃告诉我:

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

最佳答案

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

然后调用排序:

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

简单得多!

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

相关文章:

c++ - 新构建的 Cppcheck-gui 会崩溃

c++ - 使用 clocks_per_sec 计算过剩帧率太慢

visual-c++ - Visual C++看不到operator <<重载

visual-c++ - 为什么我可以在使用 Visual C++ 编译的 .exe 文件中看到类/结构名称?

c++ - MFC CString 中的可变参数和转换运算符

C++ wstring 如何从 NULL 终止的 wchar_t 数组分配

c++ - 如何在远程 C++ 的 Eclipse 中将执行显示输出到控制台?

c++ - 返回 CArray 的问题

c# - Ascii 到 XML 字符集转换

C++ MFC CComboBox 为空