2017-02-12 10 views
0

私は問題に巻き込まれており、あなたが私を助けてくれたら非常に感謝します。静的メソッドで使用されるCString

私は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; 

とどこかに私はデータで、この構造体をロード:

​​

OK 。

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

とクラッシュが私に言った:

"未処理の例外は、ユーザー・コールバックの間に発生しました。"奇妙な...

+1

デバッグヘルプを求める質問には、エラーメッセージとともに[mcve]が含まれている必要があります。また、コードが何をすべきか、どのようにそれができないのかを記述する必要があります。 Atmは何が問題なのか明確ではありません – user463035818

+0

わかりました。 – flaviu2

+0

1つの問題: 'sizeof(SRecord)'は 'sizeof(SRecord *) 'でなければなりません – franji1

答えて

1

qsort比較関数は、配列内の要素へのポインタを受け取ります。しかし、配列の要素はそれ自身がポインタであるため、引数として受け取るポインタはSRecordへのポインタ、つまりSRecord**です。

たとえば、次のようにして解決できます。

あなたがSRecord*を取得するためにSRecord**arg1をキャストし、そのポインタデリファレンス、ある
const SRecord* Record1 = *reinterpret_cast<const SRecord**>(arg1); 


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

単純多くを!

+1

私はあなたのコードを試しましたが、私はこれを受け取ります:エラーC2440: 'reinterpret_cast': 'const void *'から 'CMyDoc :: SRecord **'に変換できません...私はこの問題を解決するために遠くないと感じています。 .. – flaviu2

+0

@ flaviu2ああ、 'const'ビットを見逃しました。私の答えにそれらを加えました。私は思う...とにかくそれは何かが好きです。 :) –

+0

うーん...私はあなたが言ったことを入れた後、私はかなり同じエラーが発生します:エラーC2440: 'reinterpret_cast': 'const void *'から 'const CMyDoc :: SRecord **'に変換できません。 – flaviu2

関連する問題