[英]control reaches end of non-void function
該代碼應完美運行並給出正確的結果,但事實並非如此。 我使用了調試器,一切正常。 函數返回之前, ci
和cj
具有正確的值。 我確保在開始和結束之間始終存在一條路徑,所以這不是問題。 path
和vis
數組也填充有正確的值。 因此,唯一的問題是它何時返回。 它給出了隨機的大數字。 僅當我在函數末尾添加return語句時,它才有效。 但是我可以只在if
子句中放置一個return語句就可以創建一個函數,並且可以正常工作。 是否存在某種規則,所以函數的末尾必須有某種return語句? 為了測試它,我輸入1的3x3二維數組。 有什么辦法嗎?
編輯:我在ideone
上運行它,並且在函數末尾沒有return語句的情況下可以工作。 我的一個朋友也在他的計算機上測試過,它也可以工作。 我在Windows 7上使用代碼塊。問題可能是什么?
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <iomanip>
#include <algorithm>
#include <cmath>
using namespace std;
struct crd {
int i,j;
};
bool vis[50][50];
int map[50][50];
int path[50][50];
int di[4] = {1,-1,0,0};
int dj[4] = {0,0,1,-1};
int bfs(crd start, crd end, int n, int m)
{
queue<crd> q;
crd t,c;
q.push(start);
vis[start.i][start.j] = 1;
path[start.i][start.j] = 0;
while (!q.empty()) {
t = q.front();
q.pop();
for (int i=0; i<4; i++) {
c.i = t.i + di[i];
c.j = t.j + dj[i];
if (c.i >= 0 && c.j >= 0 && c.i < n && c.j < m) {
if (map[c.i][c.j] != -1 && vis[c.i][c.j] != 1) {
q.push(c);
vis[c.i][c.j] = 1;
path[c.i][c.j] = path[t.i][t.j] + 1;
if (c.i == end.i && c.j == end.j)
return path[end.i][end.j];
}
}
}
}
// if i put this: return path[end.i][end.j]; it works
}
int main()
{
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++)
cin >> map[i][j];
}
crd s,e;
s.i = s.j = 0;
e.i = e.j = 2;
int sp = bfs(s,e,3,3);
cout << sp << endl;
return 0;
}
編譯器非常基礎-無法知道函數將始終到達if
內if
內其他if
內while
循環內的for
循環內的返回值。 因此它警告您,您可能不會從該函數返回任何內容。 最簡單的解決方法是在結尾處返回適當的值,並僅在您現在擁有返回值的那一刻才跳出循環。
如果用非void
返回類型聲明一個函數,則此函數應返回一個值。 如果執行到達函數的末尾,並且沒有return <value>;
在那里,函數的結果是不確定的。
當您“脫離函數”的邊緣時,返回值是不確定的(意味着它可以是任何值,包括對於返回的類型無效的值)。
因此,每個函數的結尾都應有一個返回值。 或以某種方式說“我沒想到要到這里,現在就停”,如果那是適當的事情(例如,例如,您在列表中尋找某物,而您不希望找不到它,那么可以打印一些內容“我找不到,希望。正在停止...”,然后退出程序)。
如果您找不到end.i
和end.j
,我不確定要返回什么正確的東西,但是您當然應該返回SOMETHING。
您有兩個錯誤。
這是罰款,沒有return
,在一個返回值的函數的最后聲明,但前提是不能達到的功能結束。 在這種情況下,您的搜索算法可能無法找到路徑(當然取決於輸入數據的內容),然后外部循環將終止,而無需執行return
語句。 在while循環之后,您必須具有另一個return
語句,以解決這種可能性。 它不應該返回path[end.i][end.j];
而是應返回一個特殊值,表示搜索失敗。 這是編譯器已檢測到並告訴您的錯誤。
有一個錯誤在什么地方,這是造成即使確實存在,他們不被發現路徑的廣度優先搜索的邏輯。 您需要自己調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.