警告:控制到达非void函数C ++的结尾

时间:2012-12-14 21:50:11

标签: c++

我正在尝试实现Prims算法来查找给定图形的最小生成树。 代码现在编译,但可执行文件(而不是打印MST)打印“分段错误: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;
        }
    }
}

3 个答案:

答案 0 :(得分:7)

警告是指您的getWeight函数表示它会返回double,但实际上只会在某些条件下返回double。如果if语句为假(即,如果edge(v,1)为false或者t->v == w始终为false),则该函数不会返回任何内容。

如果条件不正确,也许你想要返回一些默认值。

这是否是导致细分错误的原因是另一回​​事。

答案 1 :(得分:0)

如果我理解正确,您的函数会尝试检索顶点vw之间给定边的权重。 如果该边缘不存在,或者图形数据中不存在它们之间的权重,则该函数不会返回任何内容。

即使您知道您的数据结构将很好,您也应该确保操作它的代码可以对不良数据做出反应。

#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);
}

如果图形格式不正确,上面至少会在运行时发出警告。您甚至可以根据发生的问题(edge(v,w)为false或循环无法找到正确的权重)使其抛出两个不同的异常。

如果您知道图表格式不正确,可以尝试修复它,看看它是否也修复了您遇到的段错误。

答案 2 :(得分:-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;
}