2010-11-28 15 views
0

私はマップのマップを持っています。参照によって関数「マップコンテナ」に渡すときのセグメンテーションエラー

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

flow_tは5つの符号なし整数の構造体で、fhashとfequal_toはboostライブラリで規定されているようにstdを使って行われます。

 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; 

ロングを初期化し、 "flow_redundancy"マップをクリアすることで、sorted_flows "individual_flow_tables"に挿入します。

後で "flow_t"をキーとして "sorted_flows"にアクセスし、値として "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を使って を実行します。「条件付きジャンプまたは移動は、コードの挿入行にある初期化されていない値に依存します。

代わりに、関数 "winnow"で参照 "red_table"を渡すのではなく、同じflow_tを使って "sorted_flow"マップに再度索引付けし、 "red_table"を取得しました。それは正常に働いた。

私は参照渡しで何かをしなければならないと思います。 私はC++で少し緑色ですが、合理的にC.に堪能です。 すべてのポインタは非常に役に立つでしょう。必要に応じてもっと明確にすることもできます。

ありがとうございます Govind

+0

「それがどこで値を得ているか」と働いていた代替コードは何かを示すコードスニペットを提供できますか?おそらくValgrindの詳細は? –

+0

'some_value'の値を計算するコードがいくつかありますか?それも初期化されていますか? – vpit3833

+0

皆様にお返事ありがとうございます。私はちょっと巻き込まれたので、あなたの提案には反応できませんでした。私はその理由を見つけ出したばかりで、間違っていました(変数名は地図のあるインスタンスに間違って入力されました。残念ながらこの変数は同じマップタイプとして再度定義されましたが使用されませんでした! – Govind

答えて

0

ありがとうございます。 (コードサンプルのフォーマットがうまくいけば助かりますが、それは問題の一部に過ぎません)。

しかし、別の行に失敗したコードを分解して、失敗を引き起こします。たとえば:

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

EDIT:そのred_tableに注意してください)が明らかに(unsigned long longのマップです - some_valueがあるとき>pkt_dataどのように、そして、それはmake_pair(some_key, some_value)の結果を挿入しても意味がありませんまたsome_keysome_valueを初期化しようと、それはvalgrindのエラーが離れて行かせるかどうかを見ることができunsigned long long

:?

unsigned long long some_key = 0, some_value = 0; 

そうであれば、一度に1を初期化してみてください:初期化されていない値の警告を生産しているこれらのかを確認するために

unsigned long long some_key = 0, some_value; 

unsigned long long some_key, some_value = 0; 

+0

おかげでダン!それはsegフォールトとなったばかげたエラーでした!そしてsome_valueはunsigned long longの型ではありません。ここに書いている間に私は間違って入力した – Govind

関連する問題