stl 的问题还是我的问题

xengine-qyt 2013-05-28 04:25:14
g++ 4.6.4 centos 5.5 我以IP地址作为KEY,插入进去后,关联的结构体是这个IP地址的一些基本的信息。
每次我MemoryTable_DeviceAssociate_Get 的时候都会FIND失败。为什么? STL里面明明有这个。还会失败?哪儿有问题?有的时候又是成功的。为什么?



class CMemoryTable_DeviceAssociate
{
public:
CMemoryTable_DeviceAssociate();
~CMemoryTable_DeviceAssociate();
public:
BOOL MemoryTable_DeviceAssociate_Insert(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate);
BOOL MemoryTable_DeviceAssociate_Get(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate);
BOOL MemoryTable_DeviceAssociate_Set(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate);
BOOL MemoryTable_DeviceAssociate_Del(LPCTSTR lpszDeviceAddr,BOOL bDelAll = FALSE);
BOOL MemoryTable_DeviceAssociate_IfNotExist(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate);
protected:
private:
pthread_mutex_t st_csStlRW;
private:
unordered_map<tstring,DEVICEASSOCIATE_ADDR> stl_MapDeviceAssociate;
};

CMemoryTable_DeviceAssociate::CMemoryTable_DeviceAssociate()
{
pthread_mutex_init(&st_csStlRW,NULL);
}
CMemoryTable_DeviceAssociate::~CMemoryTable_DeviceAssociate()
{
pthread_mutex_destroy(&st_csStlRW);
}
//////////////////////////////////////////////////////////////////////
// 公有函数
//////////////////////////////////////////////////////////////////////
BOOL CMemoryTable_DeviceAssociate::MemoryTable_DeviceAssociate_Insert(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate)
{
MemoryTable_IsErrorOccur = FALSE;

if ((NULL == lpszDeviceAddr) || (NULL == pSt_DeviceAssociate))
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_INSERT_PARAMENT;
return FALSE;
}

unordered_map<tstring,DEVICEASSOCIATE_ADDR>::const_iterator stl_MapIterator = stl_MapDeviceAssociate.find(lpszDeviceAddr);
if (stl_MapIterator != stl_MapDeviceAssociate.end())
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_INSERT_ISEXIST;
return FALSE;
}
pthread_mutex_lock(&st_csStlRW);
stl_MapDeviceAssociate.insert(make_pair(m_String,*pSt_DeviceAssociate));
pthread_mutex_unlock(&st_csStlRW);
return TRUE;
}

BOOL CMemoryTable_DeviceAssociate::MemoryTable_DeviceAssociate_Get(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate)
{
MemoryTable_IsErrorOccur = FALSE;

if ((NULL == lpszDeviceAddr) || (NULL == pSt_DeviceAssociate))
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_GET_PARAMENT;
return FALSE;
}
pthread_mutex_lock(&st_csStlRW);
unordered_map<tstring,DEVICEASSOCIATE_ADDR>::const_iterator stl_MapIterator = stl_MapDeviceAssociate.find(m_String);
if (stl_MapIterator == stl_MapDeviceAssociate.end())
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_GET_NOTFOUND;
pthread_mutex_unlock(&st_csStlRW);
return FALSE;
}
memcpy(pSt_DeviceAssociate,&stl_MapIterator->second,sizeof(DEVICEASSOCIATE_ADDR));
pthread_mutex_unlock(&st_csStlRW);
return TRUE;
}

BOOL CMemoryTable_DeviceAssociate::MemoryTable_DeviceAssociate_Set(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate)
{
MemoryTable_IsErrorOccur = FALSE;

if ((NULL == lpszDeviceAddr) || (NULL == pSt_DeviceAssociate))
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_SET_PARAMENT;
return FALSE;
}

unordered_map<tstring,DEVICEASSOCIATE_ADDR>::iterator stl_MapIterator = stl_MapDeviceAssociate.find(lpszDeviceAddr);
if (stl_MapIterator == stl_MapDeviceAssociate.end())
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_SET_NOTFOUND;
return FALSE;
}
pthread_mutex_lock(&st_csStlRW);
memcpy(&stl_MapIterator->second,pSt_DeviceAssociate,sizeof(DEVICEASSOCIATE_ADDR));
pthread_mutex_unlock(&st_csStlRW);
return TRUE;
}

BOOL CMemoryTable_DeviceAssociate::MemoryTable_DeviceAssociate_Del(LPCTSTR lpszDeviceAddr,BOOL bDelAll)
{
MemoryTable_IsErrorOccur = FALSE;

if (bDelAll)
{
pthread_mutex_lock(&st_csStlRW);
stl_MapDeviceAssociate.clear();
pthread_mutex_unlock(&st_csStlRW);
}
else
{
if (NULL == lpszDeviceAddr)
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_DEL_PARAMENT;
return FALSE;
}

unordered_map<tstring,DEVICEASSOCIATE_ADDR>::iterator stl_MapIterator = stl_MapDeviceAssociate.find(lpszDeviceAddr);
if (stl_MapIterator == stl_MapDeviceAssociate.end())
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_DEL_NOTFOUND;
return FALSE;
}
pthread_mutex_lock(&st_csStlRW);
stl_MapDeviceAssociate.erase(stl_MapIterator);
pthread_mutex_unlock(&st_csStlRW);
}
return TRUE;
}

BOOL CMemoryTable_DeviceAssociate::MemoryTable_DeviceAssociate_IfNotExist(LPCTSTR lpszDeviceAddr,DEVICEASSOCIATE_ADDR *pSt_DeviceAssociate)
{
MemoryTable_IsErrorOccur = FALSE;

if ((NULL == lpszDeviceAddr) || (NULL == pSt_DeviceAssociate))
{
MemoryTable_IsErrorOccur = TRUE;
MemoryTable_dwErrorCode = ERROR_NETCENTER_LOGIC_MEMORYTABLE_ASSOCIATE_INSERTORUPDATA_PARAMENT;
return FALSE;
}

unordered_map<tstring,DEVICEASSOCIATE_ADDR>::const_iterator stl_MapIterator = stl_MapDeviceAssociate.find(lpszDeviceAddr);
if (stl_MapIterator == stl_MapDeviceAssociate.end())
{
if (!MemoryTable_DeviceAssociate_Insert(lpszDeviceAddr,pSt_DeviceAssociate))
{
return FALSE;
}
}
else
{
if (!MemoryTable_DeviceAssociate_Set(lpszDeviceAddr,pSt_DeviceAssociate))
{
return FALSE;
}
}
return TRUE;
}

...全文
221 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
翅膀又硬了 2013-05-29
  • 打赏
  • 举报
回复
引用 12 楼 yunchao630 的回复:
应该是你的key的operate== 或者operate< 方法有问题,如果方便,最好把key改成ip的整数值用inet_addr转化一下
写错了 operator
翅膀又硬了 2013-05-29
  • 打赏
  • 举报
回复
应该是你的key的operate== 或者operate< 方法有问题,如果方便,最好把key改成ip的整数值用inet_addr转化一下
幸福的耗子 2013-05-29
  • 打赏
  • 举报
回复
检查下你的tstring对应的operator==
xengine-qyt 2013-05-29
  • 打赏
  • 举报
回复
...全是ansi 版本的。
passion_wu128 2013-05-29
  • 打赏
  • 举报
回复
有可能是你的宽字符跟窄字符混淆了。字符串是可以做map的key的。
xengine-qyt 2013-05-29
  • 打赏
  • 举报
回复
是的。我看了 字符串是对的,我还打印出来看,把传递进去的const char * 转成 string 类型, m_string 还是一样的,等我把IP地址转成 in_addr 试试。
Jncryang 2013-05-29
  • 打赏
  • 举报
回复
m_String是个什么东西?你要find的key是lpszDeviceAddr吧?stl不会有错,基本上检查一下你的key,和存贮在map中的key是否一致。
xengine-qyt 2013-05-29
  • 打赏
  • 举报
回复
引用 15 楼 buyong 的回复:
what is 'tstring'? why not use std::string?
就是 string..
buyong 2013-05-29
  • 打赏
  • 举报
回复
what is 'tstring'? why not use std::string?
赵4老师 2013-05-29
  • 打赏
  • 举报
回复
字符串那些事儿:BSTR-LPSTR-LPWSTR-CString-VARIANT-COleVariant-_variant_t-CComBSTR-_bstr_t http://blog.csdn.net/pizi0475/archive/2010/03/04/5346708.aspx
geekjack 2013-05-28
  • 打赏
  • 举报
回复
引用 3 楼 aaadddzxc 的回复:
[quote=引用 2 楼 geekjack 的回复:] [quote=引用 1 楼 ayrb13 的回复:] m_String,这是个什么玩意儿?楼主写的代码有点儿windows风格。。。。
感觉都是大写的东东看着好不舒服 索性不看了 - -[/quote] 既然不想看就别回复了[/quote] 。。帮顶不好吗 看了 是不是两个串不是完全相同呢 多个空格一类的? 断看看
xengine-qyt 2013-05-28
  • 打赏
  • 举报
回复
引用 4 楼 derekrose 的回复:
楼主偏爱Upper 请具体指出哪里有问题 我没找到你说的那个啊
偏爱啥? 打开才看的到 MemoryTable_DeviceAssociate_Get这个函数里面调用了stl的find方法。 有的时候莫名其妙迭代器返回NULL,为什么map容器里面有我要找的KEY啊。这玩意太难玩了,或者有C版本的HASH TABLE没有
derekrose 2013-05-28
  • 打赏
  • 举报
回复
楼主偏爱Upper 请具体指出哪里有问题 我没找到你说的那个啊
xengine-qyt 2013-05-28
  • 打赏
  • 举报
回复
引用 2 楼 geekjack 的回复:
[quote=引用 1 楼 ayrb13 的回复:] m_String,这是个什么玩意儿?楼主写的代码有点儿windows风格。。。。
感觉都是大写的东东看着好不舒服 索性不看了 - -[/quote] 既然不想看就别回复了
geekjack 2013-05-28
  • 打赏
  • 举报
回复
引用 1 楼 ayrb13 的回复:
m_String,这是个什么玩意儿?楼主写的代码有点儿windows风格。。。。
感觉都是大写的东东看着好不舒服 索性不看了 - -
ayrb13 2013-05-28
  • 打赏
  • 举报
回复
m_String,这是个什么玩意儿?楼主写的代码有点儿windows风格。。。。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧