2010-11-28 2 views
0

Приветствую всех,вина Сегментация при переходе к функции «карта контейнеров» со ссылкой

У меня есть карта карт

typedef boost::unordered_map <flow_t, individual_flow_table, fhash, fequal_to> flow_redundancy_map_t; 

flow_t представляет собой структуру из 5 целых чисел без знака, fhash и fequal_to сделаны используя std-путь, как предписано в библиотеке boost.

struct individual_flow_table{ 

redundancy_t flow_redundancy; 
    //flow_redundancy is again a map -please see typedef below 

unsigned long long redundant_bytes; 

unsigned long long num_accesses; 

unsigned long long flow_size; 

}; 

typedef map <unsigned long long , pkt_data> redundancy_t; 
    //pkt_data is a structure of 3 unsigned long long 

flow_redundancy_map_t sorted_flows; 

вставить в sorted_flows «individual_flow_tables» инициализацией лонги, а затем очищая «flow_redundancy» карту.

Позже я получить доступ к карте «sorted_flows» с помощью «flow_t» в качестве ключа, и я получаю «flow_redundancy» карту в качестве значения (код ниже)

  local_flow_redundancy = it->second.redundant_bytes; 

     local_num_accesses = it->second.num_accesses; 

     winnow(it->second.flow_redundancy); 

     it->second.redundant_bytes = local_flow_redundancy ; 

     it->second.num_accesses = local_num_accesses ; 

      /* More code */ 

      void winnow(redundancy_t & red_table) 

      {   unsigned long long some_key; 
        pkt_data some_value; 
        //more code for computation of some_key 

        redundancy_t::iterator it = red_table.find(some_key); 

        if(it!=red_table.end()) 

        /*Some updating of the red_table*/ 
        else 

        red_table.insert(make_pair(some_key, some_value)); 

      }     

Я получаю ошибку сегментации на вставке к "red_table". Я бегу с valgrind, он дает мне «Условный переход или перемещение зависит от неинициализированных значений» на строке вставки кода.

В качестве альтернативы вместо передачи по ссылке «red_table» в функции «winnow» я снова проиндексировал (используя тот же flow_t) на карту «sorted_flow» и получил «red_table» на месте. Он работал нормально.

Я полагаю, что он должен что-то сделать с передачей по ссылке. Я немного зелёный на C++, хотя разумно владею C. Любые указатели будут очень полезны. Я также могу предоставить дополнительные разъяснения, если это необходимо.

Спасибо Говинд

+0

Не могли бы вы предоставить фрагменты кода, показывающие, где `it` получает это значение, и каков был альтернативный код?Также возможно более подробная информация от Valgrind? – 2010-11-28 22:49:51

+0

У вас есть еще один код для вычисления значения `some_value`? И инициализируется ли `it`? – vpit3833 2010-11-28 23:01:50

ответ

0

Я не думаю, что есть достаточно информации здесь, чтобы быть в состоянии сообщить вам непосредственно. (Это помогло бы, если бы образцы кода были лучше отформатированы, но это только часть проблемы.)

Однако вы можете попытаться сломать код, который не работает на отдельные строки, чтобы вы могли лучше понять, что вызывает сбой. Например:

pair<unsigned long long, pkt_data> tmpValue = make_pair(some_key, some_value); 
    red_table.insert(tmpValue); 

(EDIT: Обратите внимание, что red_table является (видимо) карту unsigned long long->pkt_data Как тогда это имеет смысл, чтобы вставить результат make_pair(some_key, some_value) когда some_value есть. unsigned long long)

Вы также можете попробовать инициализацию some_key и some_value, и посмотреть, если это делает ошибки Valgrind уйти:

unsigned long long some_key = 0, some_value = 0; 

и если да, то попробуйте инициализации по одному:

unsigned long long some_key = 0, some_value; 

и

unsigned long long some_key, some_value = 0; 

, чтобы увидеть, какие из них производят предупреждение неинициализированного значения.

Смежные вопросы