簡體   English   中英

控制到達非無效函數的結尾

[英]control reaches end of non-void function

該代碼應完美運行並給出正確的結果,但事實並非如此。 我使用了調試器,一切正常。 函數返回之前, cicj具有正確的值。 我確保在開始和結束之間始終存在一條路徑,所以這不是問題。 pathvis數組也填充有正確的值。 因此,唯一的問題是它何時返回。 它給出了隨機的大數字。 僅當我在函數末尾添加return語句時,它才有效。 但是我可以只在if子句中放置一個return語句就可以創建一個函數,並且可以正常工作。 是否存在某種規則,所以函數的末尾必須有某種return語句? 為了測試它,我輸入1的3x3二維數組。 有什么辦法嗎?

編輯:我在ideone上運行它,並且在函數末尾沒有return語句的情況下可以工作。 我的一個朋友也在他的計算機上測試過,它也可以工作。 我在Windows 7上使用代碼塊。問題可能是什么?

鏈接到ideone

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

}

編譯器非常基礎-無法知道函數將始終到達ifif內其他ifwhile循環內的for循環內的返回值。 因此它警告您,您可能不會從該函數返回任何內容。 最簡單的解決方法是在結尾處返回適當的值,並僅在您現在擁有返回值的那一刻才跳出循環。

如果用非void返回類型聲明一個函數,則此函數返回一個值。 如果執行到達函數的末尾,並且沒有return <value>; 在那里,函數的結果是不確定的。

當您“脫離函數”的邊緣時,返回值是不確定的(意味着它可以是任何值,包括對於返回的類型無效的值)。

因此,每個函數的結尾都應有一個返回值。 或以某種方式說“我沒想到要到這里,現在就停”,如果那是適當的事情(例如,例如,您在列表中尋找某物,而您不希望找不到它,那么可以打印一些內容“我找不到,希望。正在停止...”,然后退出程序)。

如果您找不到end.iend.j ,我不確定要返回什么正確的東西,但是您當然應該返回SOMETHING。

您有兩個錯誤。

  1. 這是罰款,沒有return ,在一個返回值的函數的最后聲明,但前提是不能達到的功能結束。 在這種情況下,您的搜索算法可能無法找到路徑(當然取決於輸入數據的內容),然后外部循環將終止,而無需執行return語句。 在while循環之后,您必須具有另一個return語句,以解決這種可能性。 應該返回path[end.i][end.j]; 而是應返回一個特殊值,表示搜索失敗。 這是編譯器已檢測到並告訴您的錯誤。

  2. 有一個錯誤在什么地方,這是造成即使確實存在,他們不被發現路徑的廣度優先搜索的邏輯。 您需要自己調試。

暫無
暫無

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

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