以下代码段导致stackoverflow。
Unhandled exception at 0x00007FF74F27A526 in OpenARK-SDK.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000EEC5803FD8).
我该如何解决?这是我正在做出贡献的open-source repository的一部分,我希望不要在这里做出重大改变:
/***
Recursively performs floodfill on depthMap
***/
void DepthCamera::floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance)
{
if (x < 0 || x >= depthMap.cols || y < 0 || y >= depthMap.rows || depthMap.at<cv::Vec3f>(y, x)[2] == 0.0)
return;
if (closeEnough(x, y, depthMap, 4, max_distance)) {
mask.at<cv::Vec3f>(y, x) = depthMap.at<cv::Vec3f>(y, x);
depthMap.at<cv::Vec3f>(y, x)[0] = 0;
depthMap.at<cv::Vec3f>(y, x)[1] = 0;
depthMap.at<cv::Vec3f>(y, x)[2] = 0;
}
else {
return;
}
floodFill(x + 1, y, depthMap, mask, max_distance);
floodFill(x - 1, y, depthMap, mask, max_distance);
floodFill(x, y + 1, depthMap, mask, max_distance);
floodFill(x, y - 1, depthMap, mask, max_distance);
}
/***
Check whether candidate point is close enough to neighboring points
***/
bool DepthCamera::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance)
{
int num_close = 0;
if (x - 1 < 0 || depthMap.at<cv::Vec3f>(y, x - 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x - 1)) < max_distance) {
num_close++;
}
if (x + 1 >= depthMap.cols || depthMap.at<cv::Vec3f>(y, x + 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x + 1)) < max_distance) {
num_close++;
}
if (y - 1 < 0 || depthMap.at<cv::Vec3f>(y - 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y - 1, x)) < max_distance) {
num_close++;
}
if (y + 1 >= depthMap.rows || depthMap.at<cv::Vec3f>(y + 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y + 1, x)) < max_distance) {
num_close++;
}
if (num_close >= num_neighbors) {
return true;
}
return false;
}
和
double Util::euclidianDistance3D(cv::Vec3f pt1, cv::Vec3f pt2)
{
double dx = pt1[0] - pt2[0];
double dy = pt1[1] - pt2[1];
double dz = pt1[2] - pt2[2];
return sqrtf(dx*dx + dy*dy + dz*dz);
}
它被称为:
void DepthCamera::computeClusters(double max_distance, double min_size)
{
clusters.clear();
cv::Mat depthMap = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
cv::medianBlur(xyzMap, depthMap, 3);
cv::Mat mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
for (int r = depthMap.rows - 1; r >= 0; r--) {
for (int c = 0; c < depthMap.cols; c++) {
if (depthMap.at<cv::Vec3f>(r, c)[2] > 0.2) {
mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
floodFill(c, r, depthMap, mask, max_distance);
cv::Mat channels[3];
cv::split(mask, channels);
if (cv::countNonZero(channels[2]) > min_size) {
cv::medianBlur(mask, mask, 3);
clusters.push_back(mask.clone());
}
}
}
}
}
如果需要进一步的信息,请告诉我。基本上,当我靠近相机时,会发生stackoverflow异常。
我screencast试图run without debugging
尝试import java.util.Scanner;
class abc{
public static void main(String a[])
{
Scanner sc = new Scanner(System.in);
int t = Integer.parseInt(sc.next());
int scount=0,mcount=0;
while(t!=0)
{
scount=0;
mcount=0;
String str=sc.next();
for(int i=0;i<str.length();i++)
{
if(str.charAt(i)=='m')
{
mcount++;
if(i==0)
{
if(str.charAt(1)=='s')
scount--;
}
else if(i==(str.length()-1))
{
if(str.charAt(i-1)=='s')
scount--;
}
else
if(str.charAt(i-1)=='s')
scount--;
else
if (str.charAt(i+1)=='s')
scount--;
}
else if(str.charAt(i)=='s')
scount++;
}
if(scount==mcount)
System.out.println("tie");
else if(scount>mcount)
System.out.println("snakes");
else
System.out.println("mongooses");
t--;
}
}
}
。
答案 0 :(得分:3)
递归的结束条件不完整或不正确。
如果你看洪水填充,两个案例返回,一个触发递归。这告诉我们递归块是不正确的。具体来说,closeEnough()没有按预期工作,因为你已经触发了永远不会返回true的案例。
你会看到传递给closeEnough的变量,看看为什么它们永远不会满足它。只看代码我就可以知道堆栈溢出的情况永远不会发生:
if (num_close >= num_neighbors) {
我可以猜测哪些条件没有得到满足,但是你可以通过查看传递给closeEnough的值来更轻松地做到这一点。
如果还不够,请告诉我们价值观。
答案 1 :(得分:1)