簡體   English   中英

警告:控制到達非空函數C ++的末尾

[英]Warning: control reaches end of non-void function C++

我正在嘗試實現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;
        }
    }
}

警告是指您的getWeight函數說它將返回一個double但實際上僅在某些條件下才返回一個double這一事實。 如果if語句為假(即edge(v,1)為假,或者t->v == w始終為假),則該函數不返回任何內容。

如果條件不成立,也許您想返回一些默認值。

這是否是造成細分錯誤的原因則不同。

如果我理解正確,您的函數將嘗試檢索頂點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或循環找不到正確的權重)。

如果您知道圖形的格式不正確,則可以嘗試對其進行修復,然后查看它是否還可以修復您遇到的段錯誤。

這部分只是更好的編碼實踐:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM