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返回的迭代器是否有效。