控制到达非空函数的末尾

control reaches end of non-void function

本文关键字:函数 控制      更新时间:2023-10-16

这段代码应该可以完美地运行并给出正确的结果,但它没有。我使用了调试器,一切都很好。在函数返回之前,c.ic.j具有正确的值。我确保在开始和结束之间总是有一条路,所以这不是问题所在。pathvis数组也填充了正确的值。因此,唯一的问题是它何时返回。它给出随机的大数字。只有当我在函数末尾放一个return语句时,它才有效。但我可以在if子句中只放置一个返回语句来生成一个函数,并且它是有效的。是否存在某种规则,因此函数末尾必须有任何类型的返回语句?为了测试它,我输入3x3二维数组和1。有什么解决方案吗?

编辑:我在ideone上运行它,它在函数末尾没有返回语句。我的一个朋友也在他的电脑上测试了一下,它也起作用了。我在Windows7上使用代码块。问题出在哪里?

链接到视频

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

编译器非常基础-它无法知道您的函数总是在ifififforwhile循环中返回。因此,它会警告您,您可能不会从函数中返回任何内容。最简单的解决方法是在末尾返回适当的值,并且只在现在返回的点处中断循环。

如果声明一个函数的返回类型为非void,则此函数返回一个值。如果执行到函数的末尾,并且那里没有return <value>;语句,那么函数的结果将是未定义的。

当你"从函数的边缘掉下来"时,返回值是未定义的(这意味着它可以是任何东西,包括对你返回的类型无效的值)。

因此,每个函数的末尾都应该有一个return。或者用某种方式说"我没想到会到这里,现在就停下来",如果这是合适的话(例如,你正在列表中寻找某个东西,但你没想到找不到,然后打印一些东西"我找不到了,希望能。停下来…",然后退出程序)。

如果你没有找到end.iend.j,我不完全确定返回什么是正确的,但你肯定应该返回一些东西。

您有两个bug。

  1. 在返回值的函数末尾没有return语句是可以的,但如果永远无法到达函数的末尾,则。在这种情况下,您的搜索算法可能无法找到路径(当然,这取决于输入数据的内容),然后外部循环将在没有执行return语句的情况下终止。在while循环之后必须有另一个return语句,以说明这种可能性。它应该而不是返回path[end.i][end.j];。相反,它应该返回一个表示搜索失败的特殊值。这是编译器已经检测到并正在告诉您的错误。

  2. 广度优先搜索逻辑中有一个错误,导致即使路径确实存在,也找不到路径。你需要自己调试。