0

仮想照明コントロールを使用しており、マップからデータを取得しています。私の問題は、コードを実行するとリストが正常に表示されることですが、マウスカーソルがリストコントロールに移動するか、下にスクロールしようとすると、マップ/セットイテレーターが参照解除可能ではないというデバッグアサーションエラーが発生します。私の GetDispInfo() メソッドは次のとおりです。

void CListCtrlTestDlg::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
   LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
   LV_ITEM* pItem = &(pDispInfo)->item;

   map<int, Error_Struct>::iterator it  = Error_Map.find((pItem->iItem) + 1);
   int iErrCode = (*it).second.i_ErrorCode;
   CString cError = (*it).second.c_Error;


    switch(pItem->iSubItem)
    {
    case 0:
        sprintf_s(pItem->pszText, 10, "[ %d ]", iErrCode);
        break;
    case 1:
        sprintf_s(pItem->pszText, 100, "%s", cError);
        break;
    }


*pResult = 0;

}

また、マウス ポインターがリスト コントロールの上にある場合、output.c ファイルで以下に示す行からのアクセス違反を示して、プログラムが再びクラッシュします。

#else  /* _UNICODE */
   if (_putc_nolock(ch, f) == EOF)

誰も同じ経験をしましたか?ここで何が間違っているのか、どうすればこの問題を解決できますか?

ありがとう!

4

2 に答える 2

1

手始めに、sprintf_sに渡すマジック定数10と100が、実際にはpItem-> pszTextの正しいスペースであることをどのように知っていますか?pItem->cchTextを使用する必要があります。

次に、std :: map::findから返されたイテレータが有効であることを確認する必要があります。

于 2010-07-22T06:49:08.697 に答える
0

実際の問題は、データを LV_ITEM 構造体の非バッファー メンバーにコピーしようとしたことです。データを単なるポインタにコピーしようとしていましたが、それが問題でした。私が実際にすべきことは、データをコピーせずにそのポインターに値を代入することでした。

p = o_RBTree.FindByPosition((pItem->iItem) + 1);

char zKey[10];
zKey[0] = '\0';
sprintf_s(zKey, 10, "%d", p.first);

char zVal[100];
zVal[0] = '\0';
sprintf_s(zVal, 100, "%d", p.second);

if (pItem->mask && LVIF_TEXT) 
{
    switch(pItem->iSubItem)
    {
    case 0:
        pItem->pszText = zKey;
        break;
    case 1:
        pItem->pszText = zVal;
        break;
    }
}

これは完璧に機能します!助けてくれてありがとう。

于 2010-07-23T04:03:43.373 に答える