免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1992 | 回复: 4
打印 上一主题 下一主题

[C++] 谁来帮我看看这个map哪里用的有问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-05 12:46 |只看该作者 |倒序浏览
BOOLEAN CTermInst:oSaveNode(SavedNode *snode, char *key)
{
  CSNMap::iterator it = m_snMap.find(key);
  if(it != m_snMap.end())
  {
    LOG_ER(HDBG(), "TERM %s: !!! tid=%s exist, can't saved !!!", m_usrNum.num, key);
    return FALSE;
  }

  printf("--DoSaveNode-- tid=%s\n", key);
  m_snMap[key] = snode;


  it = m_snMap.find(key);
  if(it != m_snMap.end())
  {
    printf("--find ok-- tid=%s\n", key);
  }

  m_snMap["123"] = snode;

  return TRUE;
}


BOOLEAN CTermInst:reprocessMessage( AppMsgHead* pMsgHd, FSMST* fsmState )
{
  BindContext_T *pBindContext = (BindContext_T*)(pMsgHd+1);
  STN  *pStn  = &pMsgHd->stn;
  char *pBody = (char *)(pBindContext+1);
  int   nBody = pMsgHd->fsmHead.nMsgLen - sizeof(AppMsgHead) - sizeof(BindContext_T);
  
  nBody -= 1;
  pBody[nBody] = 0;
  BOOLEAN ret  = TRUE;
  pMsgHd->fsmHead.nMsgLen -= 1;

  printf("111111111111\n";

  if(pMsgHd->stn.tsOp == TRANS_CLOSE) // E_ACK
  {
    printf("1111111111111-----\n";
    printf("----- tid=%s\n", pStn->TransID.tid);



    CSNMap::iterator it=m_snMap.find(pStn->TransID.tid);
    if(it != m_snMap.end())
    {
      printf("2222222222222\n";

      SavedNode *pSNode = (*it).second;
      if(pSNode->rack == RACK_DROP)
        ret = FALSE;
      DoRemoveNode(pSNode, FALSE);
      m_snMap.erase(it);
    }


    else//*********************
    {
      CSNMap::iterator it=m_snMap.find("123";
      if(it != m_snMap.end())
      {
        printf("fuckkkk  key='123' ok size=%d\n", m_snMap.size());
      }

      printf("fuckkkkkkkkkkkkkkkkkkkkkkkkkk size=%d\n", m_snMap.size());

      it=m_snMap.begin();
      for(; it!=m_snMap.end(); it++)
      {
        SavedNode *pSNode = (*it).second;
        printf("cccccccc: tid=%s  map-tid=%s\n", pStn->TransID.tid, pSNode->sndStn.TransID.tid);
        if(strcmp(pStn->TransID.tid, pSNode->sndStn.TransID.tid) == 0 )
        {
          printf("--- stl tid=%s\n", pStn->TransID.tid);
        }
      }
    }
  }

  return ret;
}

说明:
  先调用DoSaveNode,收到消息后调PreprocessMessage,
  症状是DoSaveNode 里设置的 m_snMap[key] = snode,在后面的PreprocessMessage查找不到

map定义:
  typedef map<char*, SavedNode*> CSNMap;
  CSNMap m_snMap;

如下是运行输出:

--DoSaveNode-- tid=10073982
--find ok-- tid=10073982
19:49:51: <ImApp><4> From IMM (56):  getstate$10073982$test_17$USER=test_18$STATE=0$ACK=200$$
19:49:51: <ImApp><4> IM Message: getstate 10073982 test_17 BODY = 'USER=test_18$STATE=0$ACK=200$$'
19:49:51: <ImApp><4> PostPackage: sigCode=1011, len=39
111111111111
1111111111111-----
----- tid=10073982
fuckkkk  key='123' ok size=2
fuckkkkkkkkkkkkkkkkkkkkkkkkkk size=2
cccccccc: tid=10073982  map-tid=10073982
caonima stl tid=10073982
cccccccc: tid=10073982  map-tid=10073982
--- stl tid=10073982

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2014-12-05 13:17 |只看该作者
map<char*, SavedNode*> CSNMap; 这样的定义,key是直接指针比较。搞不明白就用string做key吧

论坛徽章:
1
双子座
日期:2013-11-14 17:43:24
3 [报告]
发表于 2014-12-05 13:17 |只看该作者
下列的定义:
typedef map<char*, SavedNode*> CSNMap;

我猜你的本意是通过字符串搜索SavedNode? 如果是这样的话,把上述的定义修改为:
typedef map<string, SavedNode*> CSNMap.

你原来的定义中,key值实际上是保存字符串的内存地址,而不是字符串本身。

论坛徽章:
0
4 [报告]
发表于 2014-12-05 14:06 |只看该作者
star_in_sky 发表于 2014-12-05 13:17
下列的定义:
typedef map CSNMap;


太感谢了。整了1上午,没想到是这问题

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
5 [报告]
发表于 2014-12-05 14:26 |只看该作者
高手,绝对是高手!回复 3# star_in_sky


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP