-1

Prims アルゴリズムを実装して、特定のグラフの最小スパニング ツリーを見つけようとしています。コードはコンパイルされますが、実行可能ファイルは (MST を出力する代わりに) "segmentation fault:11" を出力します。さらに、次の警告が表示されます。

Warning: control reaches end of non-void function

何が問題なのかを理解するのを手伝ってくれる人はいますか? 前もって感謝します。

double Graph::getWeight(int v, int w)
{
    if(edge(v,w))
    {
        Node* t = adj[v];
        while(t != NULL)
        {
            t = t->next;
            if((t ->v) == w)
            return t->weight;
        }
    }
}
4

3 に答える 3

7

警告は、getWeight関数が a を返すと言っているが、実際には特定の条件下でdoubleのみa を返すという事実に言及しています。doubleいずれかのifステートメントが false の場合 (つまり、ifedge(v,1)が false または ift->v == wが常に false)、関数は何も返しません。

条件が真でない場合、デフォルト値を返したいと思うかもしれません。

それがセグメンテーション違反の原因であるかどうかは別の問題です。

于 2012-12-14T21:52:30.420 に答える
0

私の理解が正しければ、関数は頂点vとの間の特定のエッジの重みを取得しようとしますw。そのエッジが存在しない場合、またはそれらの間の重みがグラフ データに存在しない場合、関数は何も返しません。

データ構造が正しい形式であることがわかっている場合でも、データ構造を操作するコードが不正なデータに反応できることを確認する必要があります。

#include <exception>
#include <string>

/* ... */

double Graph::getWeight(int v, int w)
{
    if(edge(v,w))
    {
        Node* t = adj[v];
        while(t != NULL)
        {
            t = t->next;
            if((t ->v) == w)
                return t->weight;
        }
    }
    std::string msg = "malformed graph: no edge between ";
    msg += v;
    msg += " and ";
    msg += w;
    throw std::runtime_error(msg);
}

グラフが適切に形成されていない場合、上記は少なくとも実行時に警告します。発生した問題に応じて、2 つの異なる例外をスローするようにすることもできます ( edge(v,w)false またはループが正しい重みを見つけることができませんでした)。

グラフが適切に形成されていないことがわかっている場合は、それを修正して、発生しているセグメンテーション違反も修正されるかどうかを確認できます。

于 2012-12-14T22:04:52.863 に答える
-1

このセグメントは、より良いコーディング方法です。

double Graph::getWeight(int v, int w)
{
    double result = 0.0;
    if(edge(v,w))
    {
        Node* t = adj[v];
        while(t != NULL)
        {
            t = t->next;
            if((t ->v) == w)
            result=t->weight;
        }
    }
    return result;
}
于 2012-12-14T22:00:18.210 に答える