-1

グラフを分割するプログラムを書いています。GraphクラスとAlgorithmクラスを取得しました。Algorithmクラスでパーティショニングを計算し、パーティショニングに従ってGraphクラスのメソッドでグラフを分割します。

私のコードは次のようになります:私のGraphClassでは:

void bisectGraph(int *iPartitioning, Graph **Subgraphs, Edge **Separator){
...
    // Store separators in an array
Separator = new Edge*[Separators.size()+1]; //Separators is a vector containing the separating edges
if(Separator == NULL)
    writeErrorMsg("Error assigning memory.", "Graph::bisectGraph");
for(i=0, SepIter = Separators.begin(); SepIter != Separators.end(); i++, SepIter++)
    Separator[i] = *SepIter;
Separator[Separators.size()] = NULL;

}

私のアルゴリズムクラスでは、次のように呼んでいます。

Edge** separators;
Graph** subgraphs;
int somePartitioning;

g->bisectGraph(somePartitioning, subgraphs, separators);

これまでのところ正常に動作しますが、たとえば次のようにセパレータ配列で作業したい場合は、次のようになります。

for(int i=0; separators[i]!=NULL, i++){
    ...
}

私は常にセグメンテーション違反を起こします。dddは、bisectGraphの最後にセパレーターにいくつかのコンテンツが含まれていることを教えてくれます。他に間違いが見つからないので、コンセプトが間違っていると思いますか?

4

1 に答える 1

1

の新しい値は、関数呼び出しの外部で変数Separatorに伝播されていません。separators関数内で割り当てている型がありEdge **ますが、それは関数の変数のコピーにのみ割り当てられます。特に指定がない限り、C++は値渡しであることに注意してください。

シグニチャをEdge **&に変更することもできますが、ベクトルを使用して、タイプが。のパラメータを使用する方が賢明vector<Edge *> &です。

于 2012-07-16T12:02:16.027 に答える