typedef std::vector<UCHAR> RESPONSE_BUFFER;
typedef TimedHashMap<int, RESPONSE_BUFFER*> TimeResponseHashMap;
内部地图原型有&#34;整数&#34;作为键和#34;指向字符向量的指针&#34;作为映射值。
TimeResponseHashMap* inner_pending_response_map;
外地图是地图的地图。它有&#34;整数&#34;作为键和&#34;指向内部地图的指针&#34;作为映射值。
std::map<int, TimeResponseHashMap* > outer_pending_response_map;
我这样插入: 内部地图是用户定义的地图,因此它具有不同的格式。
inner_pending_response_map->Insert((int)s16MessageID, &resp_buffer, expirytime);
outer_pending_response_map.insert(make_pair((int)s16SessionID,
inner_pending_response_map));
TimeResponseHashMap提供用户定义的界面&#34;查找&#34;访问地图成员。
template <typename Key, typename ElementObject>
THM_ERROR TimedHashMap<Key, ElementObject>::Find(const Key& k, ElementObject& e)
{
typename hash_map<Key, BaseElement_*, dw_hash<Key>, dw_equal_to<Key> >::iterator itr;
try
{
itr = h_->find(k);
} catch ( ... )
{
return E_INTERNAL_ERROR;
}
if ( itr == h_->end() )
{
e = NULL;
return E_ITEM_NOT_FOUND;
}
e = itr->second->e_;
return E_SUCCESS;
}
我有两个键,现在我需要访问&#34;映射值&#34;内部地图。内部地图使用上面的Find()函数进行搜索。我需要将RESPONSE_BUFFER变量作为第二个参数传递给Find()函数。
我试图像这样提取错误的输出:
RESPONSE_BUFFER resp_buffer;
ExtractFragmentResponse(u16Key1, u16Key2, &resp_buffer);
ExtractFragmentResponse的定义如下:
STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID,
RESPONSE_BUFFER* resp)
{
(((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}
resp没有给我正确的数据。 怎么办呢?
答案 0 :(得分:1)
这可能不能直接回答这个问题,但它确实会提到为什么使用的代码非常错误,应该分解成几行。
STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID,
RESPONSE_BUFFER* resp)
{
(((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}
让我们说这实际上确实&#34;工作&#34;。无论如何,它存在一个主要问题。问题是:
outer_pending_response_map.find(u16SessionID)
如果find
找不到条目u16SessionID
会怎样?您现在已被退回outer_pending_response_map.end()
。当使用此返回值时:
outer_pending_response_map.end()->second
你应该做的是:
std::map<int, TimeResponseHashMap* >::iterator it1 = outer_pending_response_map.find(u16SessionID);
if ( it1 != outer_pending_response_map.end())
(it1->second)->Find((int)u16MessageID, resp);
else
{
// you fill in what happens if the find fails
}
要调试您的问题,您可以进一步细分这些内容以确保您获得的内容有效:
std::map<int, TimeResponseHashMap* >::iterator it1 = outer_pending_response_map.find(u16SessionID);
if ( it1 != outer_pending_response_map.end())
{
TimeResponseHashMap *theMap = it1->second;
theMap->Find((int)u16MessageID, resp);
}
else
{
// you fill in what happens if the find fails
}
上面的代码将it1->second
保存到一个值(theMap
),您可以轻松检查它是否正确。