0

我正在使用虛擬光照控制,並從地圖獲取數據。我的問題是當我運行代碼時,它顯示列表ok,但是當鼠標光標移動到列表控件上或者當我嘗試向下滾動時,它會發出Debug Assertion失敗,說map/set迭代器不可取消。我的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; 

}

此外,如果當鼠標指針是在該列表控制的頂部,再次程序崩潰說從線訪問衝突下面輸出顯示。 c文件:

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

有沒有人有相同的經驗?我在這裏做錯了什麼,我該如何解決這個問題?

謝謝!

回答

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

這很完美!謝謝您的幫助。

1

對於初學者,您如何知道您傳遞給sprintf_s的魔術常量10和100實際上是pItem-> pszText中的正確空間量?你應該使用pItem-> cchText。

其次,您應該檢查從std :: map :: find返回的迭代器是否有效。