Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 18. leden 2015, 08:24:51 Předmět: c++ map/set iterator not dereferencable |
|
|
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 |
|
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 18. leden 2015, 10:52:01 Předmět: |
|
|
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 |
|
Návrat nahoru |
|
|
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 18. leden 2015, 11:09:10 Předmět: |
|
|
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 |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 18. leden 2015, 11:11:38 Předmět: |
|
|
koso> jen pro uplnost, jaky je typ nodeHashMap? _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 18. leden 2015, 11:41:39 Předmět: |
|
|
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 |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 18. leden 2015, 12:35:49 Předmět: |
|
|
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 |
|
|
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 18. leden 2015, 12:45:08 Předmět: |
|
|
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 |
|
|
|