[英]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
始終為假),則該函數不返回任何內容。
如果條件不成立,也許您想返回一些默認值。
這是否是造成細分錯誤的原因則不同。
如果我理解正確,您的函數將嘗試檢索頂點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);
}
如果圖形格式不正確,以上內容至少會在運行時警告您。 您甚至可以根據發生的問題使它引發兩個不同的異常( 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.