首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟列表控制问题

虚拟列表控制问题
EN

Stack Overflow用户
提问于 2010-07-22 14:30:55
回答 2查看 838关注 0票数 0

我使用的是一个虚拟的照明控件,我从地图中获取数据。我的问题是,当我运行代码时,它显示列表ok,但是当鼠标光标移到列表控件上或者当我试图向下滚动时,它给出一个Debug断言失败,指出map/set迭代器是不可引用的。我的GetDispInfo()方法如下:

代码语言:javascript
复制
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文件中显示的以下行的访问冲突:

代码语言:javascript
复制
#else  /* _UNICODE */
   if (_putc_nolock(ch, f) == EOF)

有没有人有过同样的经历?我在这里做错了什么?我如何解决这个问题?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-23 12:03:43

实际的问题是,我试图将数据复制到LV_ITEM结构的非缓冲区成员。我只是想把数据复制到一个指针上,这就是问题所在。我真正应该做的是在不复制数据的情况下为指针赋值。

代码语言:javascript
复制
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;
    }
}

这个很好用!谢谢你的帮助。

票数 0
EN

Stack Overflow用户

发布于 2010-07-22 14:49:09

首先,您如何知道您传递给sprintf_s的魔术常量10和100实际上是pItem->pszText中的正确空间量?您应该使用pItem->cchText。

其次,您可能应该检查从std::map::find返回的迭代器是否有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3306309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档