0

J'utilise un contrôle éclairé virtuel et j'obtiens les données d'une carte. Mon problème est quand j'exécute le code, il affiche la liste ok, mais quand le curseur de souris se déplace sur le contrôle de liste ou quand j'essaye de défiler vers le bas, il donne un échec de Debug Assertion disant map/set iterator n'est pas déréférencable. Ma méthode GetDispInfo() est comme suit:Problème de contrôle de liste virtuelle

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; 

}

Aussi, si lorsque le pointeur de la souris est au-dessus du contrôle de la liste, à nouveau le programme se bloque en disant violation d'accès de la ligne a montré ci-dessous en sortie. c fichier:

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

Est-ce que quelqu'un a eu la même expérience? Qu'est-ce que je fais mal ici et comment puis-je résoudre ce problème?

Merci!

Répondre

0

Le problème réel était que j'essayais de copier des données vers un membre non-tampon de la structure LV_ITEM. J'essayais de copier des données à un simple pointeur, c'était le problème. Ce que j'aurais vraiment dû faire était d'assigner une valeur à ce pointeur sans copier les données.

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

Cela fonctionne parfaitement! Merci pour l'aide.

1

Pour commencer, comment savez-vous que vos constantes magiques 10 et 100, que vous passez à sprintf_s, sont en réalité la bonne quantité d'espace dans pItem-> pszText? Vous devriez utiliser pItem-> cchText. Deuxièmement, vous devriez probablement vérifier que l'itérateur renvoyé par std :: map :: find est valide.