<map> Key vorhanden?



  • plizer schrieb:

    ...und krieg es nicht hin den string aus "->" first irgendwie zu nutzen. 😡

    string s = myIter->first;
    

    error C2664: 'struct _TREEITEM *__thiscall CTreeCtrl::InsertItem(struct tagTVINSERTSTRUCTA *)' : Konvertierung des Parameters 1 von 'class std::basic_string<char,struct std::char_traits<ch
    ar>,class std::allocator<char> >' in 'struct tagTVINSERTSTRUCTA *' nicht moeglich
    Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden

    Punkt 1: Ist die Meldung auch aus der entsprechenden Zeile?

    Es sieht eher danach aus als das du einen Typ "struct tagTVINSERTSTRUCTA*" (der vermutlich via Typedef oder Makro einen anderen Namen bekommen hat (MFC?) einen String zuweist.

    Punkt 2: Wenn die Meldung aus der Zeile kommt: ist Vielleicht ->first von einem anderen Typ definiert (Sprich ist der Key der Map ein anderer Typ? map<FIRST, SECOND>)?

    cu André



  • Der gepostete Code scheint irgendwie nicht ganz zur Fehlermeldung zu passen...

    btw, statt make_pair könntest du auch my_map_type::value_type("hello", "world") verwenden.



  • Oh, Ihr beide habt Recht! Das passt nicht!
    Also jetzt werd ich mich erst wieder melden, wenn ich den Programmteil fertig bekomme. Ist ja schrecklich, dass ich jeden Scheiss fragen muss. Sry dafür und danke für eure Hilfe! 🙂



  • plizer schrieb:

    Vor 10 Jahren bin ich mit C++ angefangen und hatte das mit den Zeigern auch soweit verstanden, aber nach 7 Jahren Java geht das wahrscheinlich nie wieder in mein Hirn rein :(.

    plizer schrieb:

    Ist ja schrecklich, dass ich jeden Scheiss fragen muss. Sry dafür und danke für eure Hilfe! 🙂

    Zur seelischen Unterstützung:
    Bei mir war's genauso. Ich habe damals zwar mehr C programmiert und nicht so viel C++, aber nach einigen Jahren Java ist mir inzwischen einiges 'suspekt' und man fragt sich sooo oft, warum man sich um a und b kümmern will, wenn man doch nur c machen will.... der aufmerksame Leser wird das Wortspiel bemerkt haben 😃
    Also sei beruhigt. Mir geht's genauso. Die Konzentration auf die Fachlichkeit ist einfach nicht möglich, ohne viel Übung und Praxis.



  • @SammyRukka: Danke, gut zu wissen, dass man nicht alleine ist! 🙂

    Entgegen meiner angekündigten Fragenenthaltsamkeit, muss ich nun doch nochmal nachfragen, denn es ist etwas Neues gekommen, was ich so noch nicht kenne. Das Programm kompiliert einwandfrei, stürzt aber einfach ab. Ich habe es mit dem Debugger auf eine Zeile (der fettgedruckten) reduzieren können:

    [cpp]string aktuellRealteil;
    while(iterRealteil != mapRealteile.end()) {
    [b]aktuellRealteil = iterRealteil->first;[/b]
    m_ctlTreeCtrl.InsertItem(aktuellRealteil.c_str());
    }[/cpp]
    

    Er stürzt übrigens schon beim ersten Schleifendurchlauf ab, also kommt er garnicht zur Zeile mit dem TreeCtrl.
    Ich habe mir im Debugger auch die Unteraufrufe dieser Zeile angeschaut und er kommt hier letztendlich zm Absturz:

    const _E *c_str() const
    {return (_Ptr == 0 ? _Nullstr() : _Ptr); }
    

    aus der Datei:

    // xstring internal header (from <string>)

    Wie geht man nun bei solchen Fehlern vor? first liefert ja einen string zurück und wird "aktuellRealteil" zugeordnet, also wie kann er da abstürzen? Auch first.c_str() hilft nicht weiter.

    Die Absturzmeldung heisst übrigens:

    Unbehandelte Ausnahme in egal.exe (MSVCP60D.DLL): 0xC0000005: Access Violation.

    PS: Warum hat beim oberen Quelltext denn nicht [ cpp]text[ /cpp] funktioniert? Mit [ code]text[ /code] gings.



  • plizer schrieb:

    ...
    PS: Warum hat beim oberen Quelltext denn nicht [ cpp]text[ /cpp] funktioniert? Mit [ code]text[ /code] gings.

    Die cpp-Tags unterstützen keine "Schachtelung" mit Formattags (frag' mich nicht, warum - weiß ich nicht).

    Zu Deiner eigentlichen Frage habe ich auch erstmal keine Antwort.
    Magst Du mal ein kleines "Komplettbeispiel" (Map-Def, -Füllung und -Auslesen) zusammenstellen, bei dem dieser Fehler auftritt ?

    Gruß,

    Simon2.



  • Ich hab das Problem gelöst. Es fehlte einfach oben die Zuweisung des Iterators mit mapName.begin().

    Ok, dann weiss ich ja auch schonmal, wie Unachtsamkeiten bestraft werden können!



  • 0xC0000005: Access Violation.

    Ist praktisch immer auf nen ungültigen Pointer zurück zuführen... da es verboten ist auf die Speicheradresse Null (und ein paar andere auf Systemebene) zu zugreifen. Und da du vergessen hast begin auf iterRealteil zu zuweisen, war auch iterRealteil anscheinend Null. Und peng!



  • Ah, gut. Werd ich mir hinter die Ohren schreiben mit Null-Pointer. Das kenn ich aus Java natürlich auch recht gut ;).



  • plizer schrieb:

    Ich hab das Problem gelöst. Es fehlte einfach oben die Zuweisung des Iterators mit mapName.begin().

    Mist, das hätte sogar ich Dir sagen können, das war meine Chance zu glänzen. Hatte das Problem Anfang der Woche 🙂

    Artchi schrieb:

    0xC0000005: Access Violation.

    Ist praktisch immer auf nen ungültigen Pointer zurück zuführen...

    Wobei in diesem Fall das Glück war, dass string einen Nullpointer definiert und nicht ins Nirvana zeigt, korrekt? Als Anfänger kann man solche Pointer nämlich gut mal mit der falschen Syntax erwischen.



  • Jippi, das Programm ist fertig 😉 und die Performace perfekt. Ich war allerdings echt blöde. Erst habe ich die Knotenpunkte auf Existenz überprüft, war sehr langsam. Danach mit verschachtelten maps, ob bereits dieses Element vorhanden ist. Das war schon wesentlich schneller. Nachdem ich das fertig hatte, ist mir die Idee gekommen, ganz ohne maps auszukommen. Tja, so gings dann auch, einfach mit ein paar Variablen, die die letzten Baumwerte gespeichert haben und noch dafür sorgen, dass die strings aus der DB in einer sortierten Reihenfolge kommen und fertig. Das war dann nochmal wesentlich schneller (ca. Faktor 5-10). Jetzt braucht der Baum, der bis Ebene 5 geht, ca. 500ms für 5500 Knoten/Unterknoten. Habe allerdings keinen Vergleich zu anderen C++/MFC Realisierungen des TreeCtrls.

    Aber im Grunde machts nichts, dass ich es vorher mit dem TreeCtrl und den maps gemacht habe, so lernt man ja schließlich.

    Mein Wissen hat sich dank eurer Hilfe mind. verdreifacht in der letzten Woche ;-). (von 0,1% auf 0,3%).

    Vielen Dank für alle die mir geantwortet haben!

    Schöne Grüße,
    plizer



  • plizer schrieb:

    Jippi, das Programm ist fertig 😉 und die Performace perfekt....

    Herzlichen Glückwunsch !!!! 👍 👍 😋 😋

    Gruß,

    Simon2.


Anmelden zum Antworten