000
03.05.2004, 08:22 Uhr
nano
|
Ich hab da ein großes kleines Problem mit den stl hash_map s. Erst mal mein code:
C++: |
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:
C++: |
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:
C++: |
valueIdPair valid; valid.value; valid.gid;
|
Ich wandle dann vaild.value in einen char* um:
C++: |
valid.value[VALUE_LEN+1] = '/0'; char *val = &valid.value[0];
|
Habs auch schon so probiert:
C++: |
string tmp_value = val_id.value; char *val = (char*)tmp_value.c_str();
|
aber beim aufruf von
C++: |
addEntry("testname",val,2);
|
passiert der obengenannte Fehler!
Was mach ich falsch? |