私はマップのマップを持っています。参照によって関数「マップコンテナ」に渡すときのセグメンテーションエラー
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
「それがどこで値を得ているか」と働いていた代替コードは何かを示すコードスニペットを提供できますか?おそらくValgrindの詳細は? –
'some_value'の値を計算するコードがいくつかありますか?それも初期化されていますか? – vpit3833
皆様にお返事ありがとうございます。私はちょっと巻き込まれたので、あなたの提案には反応できませんでした。私はその理由を見つけ出したばかりで、間違っていました(変数名は地図のあるインスタンスに間違って入力されました。残念ながらこの変数は同じマップタイプとして再度定義されましたが使用されませんでした! – Govind