доступ к значению на карте карт

0
typedef std::vector<UCHAR> RESPONSE_BUFFER;
typedef TimedHashMap<int, RESPONSE_BUFFER*> TimeResponseHashMap;

Прототип внутренней карты имеет "целое" как ключ и "указатель на вектор символов" в качестве отображаемого значения.

TimeResponseHashMap* inner_pending_response_map;

Внешняя карта - это карта карт. он имеет "целое" как ключ и "указатель на внутреннюю карту" в качестве отображаемого значения.

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 предоставляет пользовательский интерфейс "Найти" для доступа к членам карты.

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;
}

У меня есть оба ключа, и теперь мне нужно получить доступ к "отображаемому значению" внутренней карты. На внутренней карте используется функция 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
    какой интерфейс обеспечивает TimedHashMap ?
  • 0
    Я добавил код для интерфейса TimedHashMap
Показать ещё 3 комментария
Теги:
pointers
maps
std

1 ответ

1
Лучший ответ

Это не может напрямую ответить на вопрос, но это порождает, почему используемый код сильно ошибочен и должен быть разбит на несколько строк.

STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID, 
RESPONSE_BUFFER* resp)
{
  (((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}

Пусть говорят, что это действительно "работало". Есть большая проблема с этим, независимо. Проблема заключается в следующем:

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), которое вы можете легко проверить, чтобы убедиться, что оно правильно.

  • 0
    Спасибо за подробное объяснение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню