hash_map mit const char* key - problem
-
Ich hab da ein großes kleines Problem mit den stl hash_map s.
Erst mal mein code:struct eqstr { bool operator()(const char* s1, const char* s2) const { //cout << "from eqstr: " << s1 << " == " << s2 << " ? " << (strcmp(s1, s2) == 0) << endl; return strcmp(s1, s2) == 0; } }; typedef set<gid_t> gidSet_t; typedef hash_map<const char*, gidSet_t, hash<const char*>, eqstr> valueMap_t; typedef hash_map<const char*, valueMap_t, hash<const char*>, eqstr> nameMap_t; typedef hash_map<const char*, char, hash<const char*>, eqstr> chgMap_t; struct valueIdPair { char value[VALUE_LEN+1]; gid_t gid; }; char addEntry(char* name, char* value, gid_t gid, char chg) { valueMap_t valueMap; gidSet_t gidSet; chgMap[name] = chg; nameMap.insert(nameMap_t::value_type(name, valueMap)); nameMap[name].insert(valueMap_t::value_type(value, gidSet)); pair<gidSet_t::iterator, bool> result = nameMap[name][value].insert(gid); if(result.second) return 0; else return 1; }
So nun zu meinem Problem:
die funktion addEntry functioniert prächtig wenn ich die Parameter direkt belege:addEntry("testname","testvalue",1);
Wenn ich das ganze über den struct valueIdPair versuche funktioniert die hash funktion nicht richtig und einzelne schlüssel werden überschrieben und die daten sind nur chaos.
Ich benötige den struct um die Indexstruktur in einer Binärdatei zu speichern.
Die kann ich dann auch gut auslesen und erhalte:valueIdPair valid; valid.value; valid.gid;
Ich wandle dann vaild.value in einen char* um:
valid.value[VALUE_LEN+1] = '/0'; char *val = &valid.value[0];
Habs auch schon so probiert:
string tmp_value = val_id.value; char *val = (char*)tmp_value.c_str();
aber beim aufruf von
addEntry("testname",val,2);
passiert der obengenannte Fehler!
Was mach ich falsch?
-
fünfmaliges Posten hilft dir da zumindest nicht unbedingt weiter.
-
ethereal schrieb:
fünfmaliges Posten hilft dir da zumindest nicht unbedingt weiter.
Tut mir wirklich leid...
aber vieleicht kann mir jemand trotzdem helfen...
Danke
-
Mach aus
return strcmp(s1, s2) == 0;
mal ein
return strcmp(s1, s2) < 0;
-
Hab ich schon ausprobiert, da kommt das Programm in ne endlosschleife.
In der doku von sgi steht das so mit dem eqstr.
Und es wir definitif gleichheit erkannt. Das hab ich mit der auskommentierten Zeile getestet...
-
Komando zurück, hab mitlerweile das problem gefunden.
Während hash_map<char*,T> eine standart hash funktion hat, welche auf dem Inhalt des strings aufbaut, basiert die standart vergleichs methode equal_key<char*> auf der Adresse des Strings und nicht auf dessen Inhalt.