Re: Stl map and CString trouble
On Oct 3, 10:26 am, "Duane Hebert" <s...@flarn.com> wrote:
" Why do you need pointers for the map and the bytes?"
the map is on the heap, so I need a pointer to it. The bytes are also
an allocated chunk on the heap, and so I need the addresses for an
application specific task.
Anyway, how do you assign to the map?
It's over several hundred to thousand lines of parsing a file, but it
boils down to:
int MapVar(string p_pszName, char* p_pszType)
{
//If bool, update boolspace vars.
if (0 == strcmp("BOOL",p_pszType))
{
if (g_pbCurrentBoolSpace + sizeof(bool) >
(bool*)g_piCurrentIntSpace) //this also handily catches if it's
already maxed!
{
Monitor(MON_ALWAYS, "MapVar",
"Fatal Error -- bool var space overlapped with int space. %s",
"Forcing Preprocessor Run.");
return 0;
}
(*g_VarMap)[p_pszName] = (byte*)(g_pbCurrentBoolSpace);
g_pbCurrentBoolSpace += sizeof(bool);
}
//If int, update int vars.
if (0 == strcmp("INT", p_pszType))
{
if (g_piCurrentIntSpace + sizeof(int) >
(int*)g_pfCurrentFloatSpace) //this also handily catches if it's
already maxed!
{
Monitor(MON_ALWAYS, "MapVar",
"Fatal Error -- int var space overlapped with float space. %s",
"Forcing Preprocessor Run.");
return 0;
}
(*g_VarMap)[p_pszName] = (byte*)(g_piCurrentIntSpace);
g_piCurrentIntSpace += sizeof(int);
}
//If float, update float vars.
if (0 == strcmp("FLOAT", p_pszType))
{
if (g_pfCurrentFloatSpace + sizeof(float) > (float*)g_VarSpaceMax) //
this also handily catches if it's already maxed!
{
Monitor(MON_ALWAYS, "MapVar",
"Fatal Error -- float var space overflowed with var space. %s",
"Forcing Preprocessor Run.");
return 0;
}
(*g_VarMap)[p_pszName] = (byte*)(g_pfCurrentFloatSpace);
g_pfCurrentFloatSpace += sizeof(float);
}
return 1;
}
How do you create the byte*?
typdef. it's an unsigned char.
What if you use:
std::map<std::string, std::string> g_VarMap;
and do
g_VarMap [5](("AA",0x003a9e0b ""),("BB",0x003a9e1b ""),("XX",
0x003a9c95 ""),("YAR",0x003a9c96 ""),("YY",0x003a9c94 ""))
g_VarMap["AA"] = "0x003a9e0b";
g_VarMap["BB"] = "0x003a9e1b ";
g_VarMap["XX"] = "0x003a9c95 ";
g_VarMap["YAR"] = "0x003a9c96 ";
g_VarMap["YY"] = "0x003a9c94 ";
then:
std::map<std::string,std::string>::iterator it = g_VarMap.find("YAR");
if(it != g_VarMap.end()) {
//do something with it.second.
I get the same result, in the same place.
std::string szName = pszVar;
toUpper(szName);
iter = g_VarMap->find(szName); <<returns garbage.
I prefer to use CStrings if I can, for the utility and the unicode
support. That said... I still have the problem. As of right now, the
memory locations aren't critical... I haven't made it that far. I'm
just trying to get the map to cooperate. If it compares a pointer,
this obviously fails. If it compares values this should never be
failing. And CString has the == overloaded, which I believe is what
the find() uses (insert and [] use <, but I think the find() uses ==).