.[ ČeskéHry.cz ].
c++ map/set iterator not dereferencable

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 18. leden 2015, 08:24:51    Předmět: c++ map/set iterator not dereferencable Odpovědět s citátem

Zdravim

Pri volani nodeHashMap.find(_name) som dostaval vyssie spomenuty error kedze vysledok ukazoval na end().
Osetril som to takto :
kód:
auto temp = nodeHashMap.find(_name);
   if (temp != nodeHashMap.end()) 
   {
      return temp->second;
   }

zbavil som sa erroru ale .find() nenajde ziadnu zhodu s klucom. Pritom v tej mape zaznam z danym klucom urcite je. Nejake napady?

Dakujem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 18. leden 2015, 10:52:01    Předmět: Odpovědět s citátem

Pokud find() nic nenasel, tak tam ten zaznam opravdu neni. Dej si pozor na case sensitivitu a na to, jestli nemas v retezci netisknutelne znaky.

Podivej se na to pres debugger, at vis co tam opravdu mas Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 18. leden 2015, 11:09:10    Předmět: Odpovědět s citátem

ved prave, jasne ze som to kontroloval cez debugger, je tam prave jeden prvok a kluc sedi s vyhladavanym retazcom, este som ich skusal pred samotnym find() porovnavat cez string::compare a vyslo mi ze sa zhoduju.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 765
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 18. leden 2015, 11:11:38    Předmět: Odpovědět s citátem

koso> jen pro uplnost, jaky je typ nodeHashMap?
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 18. leden 2015, 11:41:39    Předmět: Odpovědět s citátem

kód:
map<const char*, Node*> nodeHashMap


Je to mapa pointerov na instancie triedy Node.

Inak skusil som odkrokovat celu tu find() metodu:

kód:
iterator find(const key_type& _Keyval)
{   // find an element in mutable sequence that matches _Keyval
   iterator _Where = lower_bound(_Keyval);
   return (_Where == end()
      || _DEBUG_LT_PRED(this->_Getcomp(),
         _Keyval, this->_Key(_Where._Mynode()))
            ? end() : _Where);
}


na konci metdoy:
kód:
_Keyval = 0x002cfae0 "RootNode"

_Where = (0x014156f4 "RootNode", 0x0452efe0 {meshCount=0 childrenCount=0 visible=true ...})


cize najde ten pozadovany prvok ktory hladam ale ked to vyskoci z toho find() tak navratova hodnota z nej je
kód:
(0xcdcdcdcd <Error reading characters of string.>, 0xcdcdcdcd {meshCount=??? childrenCount=??? visible=??? ...})
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 765
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 18. leden 2015, 12:35:49    Předmět: Odpovědět s citátem

kód:
map<const char*, Node*> nodeHashMap


Pouziva jako klic v mape ukazatel (tj. adresu v pameti), ne ten retezec co na te adrese je ulozeny, tj. pokud nehledas s uplne stejnym retezcem (stejnym ukazatelem na char), tak tu hodnotu nenajdes.

Muzes si to vyzkouset:

kód:

map<const char*, bool> my_map;
const char name1[] = "foo";
const char name2[] = "foo";
my_map[name1] = true;
assert(my_map.find(name2) != my_map.end())


Ve skutecnosti chces bud
kód:

map<std::string, Node*> nodeHashMap;

nebo pokud trvas na const char* (coz moc nedoporucuju kvuli memory leakum), tak neco jako
kód:

bool str_less(const char* a, const char* b) { return strcmp(a, b) < 0; }

map<std::string, Node*, str_less> nodeHashMap;

_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 18. leden 2015, 12:45:08    Předmět: Odpovědět s citátem

OndraSej velka vdaka, ked si to napisal tak som si uvedomil okolnosti, dovtedy ma to ani nenapadlo. Uz to funguje tak ako by malo.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna