Probleme mit CMap: Assertion bei Zugriff
-
Moin!
Ich stehe gerade mit einer CMap auf Kriegsfuß.
Ich will als Schlüssel einen UINT (Control ID) haben und mit dem dann auf einen CString (Tooltip) zugreifen.Leider habe ich noch nie mit CMap gearbeitet und komme daher nicht weiter.
So weit bin ich:// Im Header CMap<UINT, UINT, CString, CString> m_mapTooltips;// Im Konstruktor m_mapTooltips.InitHashTable(257); // Mehr Dialogelemente gehen nicht // Später dann füllen void CBasisView::AddTooltip(UINT f_nCtrlID, CString f_strText) { m_pToolTip->AddTool(GetDlgItem(f_nCtrlID), f_strText); m_mapTooltips.SetAt(f_nCtrlID, f_strText); }Und wenn ich nun mit
CString CBasisView::GetTipText() { CString strReturn; if (m_mapTooltips.Lookup(m_nCtrlID, strReturn)) { return strReturn; } return _T(""); }zugreifen will, lande ich da:
// check to make sure the VTable pointer is valid ASSERT(sizeof(CObject) == sizeof(void*)); if (!AfxIsValidAddress(*(void**)pOb, sizeof(void*), FALSE)) { TRACE0("ASSERT_VALID fails with illegal vtable pointer.\n"); if (AfxAssertFailedLine(lpszFileName, nLine)) AfxDebugBreak(); return; // quick escape }Was hab ich vergessen/falsch gemacht?

-
Versuchs mal mit
CMap<UINT, UINT, CString, CString&> m_mapTooltips;
-
Das scheint mir nicht an der Map zu liegen. Der Assert sagt klar, dass es sich um kein gültiges Objekt handelt!
Was zeigt denn der Callstack?
-
Nein, das war es leider auch nicht.

Also es ist genau diese Funktion in CMap:template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE> BOOL CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::Lookup(ARG_KEY key, VALUE& rValue) const { ASSERT_VALID(this); UINT nHash; CAssoc* pAssoc = GetAssocAt(key, nHash); if (pAssoc == NULL) return FALSE; // not in map rValue = pAssoc->value; return TRUE; }In Zeile 7 steht der grüne Pfeil.
-
Martin Richter schrieb:
Was zeigt denn der Callstack?
AfxAssertValidObject(const CObject * 0x018c606c {CObject}, const char * 0x101bd784 _szAfxTempl, int 1342) line 96 CMap<unsigned int,unsigned int,CString,CString &>::Lookup(unsigned int 3722304989, CString & {""}) line 1345 CBasisView::GetTipText() line 363 + 28 bytesDas sind die obersten Zeilen. Je der Code davon ist hier schon gepostet.
Kann ich noch irgendwelche Werte nachucken? Ich weiß grade echt nicht, was ich suchen soll.Wenn der Schlüsselwert nicht existiert, dann müsste ich doch einfach nur FALSE bekommen.

-
Ist denn der this Zeiger von CBasisView wirklich nicht NULL. Kommt mir eher vor als ob CBasisView nicht angelegt wurde.
Wie besorgst Du Dir denn den Zeiger?
-
Martin Richter schrieb:
Ist denn der this Zeiger von CBasisView wirklich nicht NULL. Kommt mir eher vor als ob CBasisView nicht angelegt wurde.
Wie besorgst Du Dir denn den Zeiger?Ja, das war es.

Ich hab das immer noch falsch aufgerufen, weil ich eigentlich nen String mitschicken wollte und dann wegen Castproblemen umgestellt hatte.
Immerhin gibt es jetzt keinen ASSERT mehr - aber den falschen Text.
Mal gucken, was das nun wieder ist.Vielen Dank erstmal an euch beide.
