递归n皇后程序中c++分段错误的处理
Getting C++ Segmentation Fault error in recursive n-queen program
基本上,我必须编写一个基本的程序来解决n-queen问题,我已经完成了,但是如果我输入任何数字>=11,它会抛出分段错误。
从我在网上看到的,这个错误通常是由错误的逻辑在处理内存时引起的,但我似乎不知道我做错了什么。
void generateBoard(int board[],int column,int length,int count)
{
if(column == 0 && board[0]<length) //prevents outputting the results infinitely
{
++board[0];
generateBoard(board, ++column, length, count);
}
else
{
bool lineNotFound = true;
int row = board[column];
while(lineNotFound && row < length)
{
++row; //temporary value for a column value candidate
lineNotFound = false;
for(int i = 0; i < column && !lineNotFound; ++i)
{
if(board[i] == row || (board[i]+column-i) == row || (board[i]-column+i) == row) // check diagonal and horizontal
{
lineNotFound = true;
}
else
{
board[column] = row;
}
}
}
if(column == length-1 && !lineNotFound) // at last column and valid board
{
output(board,length,++count);
generateBoard(board,column,length,count);
}
else if(!lineNotFound) // not at last column, but valid position found
{
generateBoard(board,++column,length,count);
}
else if(column != 0) //no valid columns, go back a step
{
board[column] = 0;
generateBoard(board,--column,length,count);
}
}
}
我知道这是一大块代码,但我认为有必要将其全部发布以了解问题。
任何想法?: s
我是c++编程新手,所以我不知道从哪里开始调试这个
开始调试,然后让它运行,直到出现分段故障。当故障发生时-查看堆栈。我猜你在递归中超出了堆栈——这是递归程序的主要问题。
你可以扩大你的堆栈,然后错误不会发生在输入11上,而是发生在其他数字上,但是递归程序总是会在输入足够大的堆栈问题上崩溃。
顺便说一下,确保你的递归是有界的,即:在某些时候,你的函数应该退出而不进一步调用自己。恕我直言,最好在一开始就这样做(尽管这是风格和方便的问题),因为这样您就可以清楚地看到递归结束的条件,并且更容易调试无限递归(这也会导致由于堆栈耗尽而导致的segfault)。在你的例子中,递归是如何结束的不是很清楚,对于一些输入,它不是结束的,我不会感到惊讶。而在一些系统上你得到一个"堆栈溢出"错误,在其他你会得到"分割错误"为同样的事情。我猜你在"其他人"中的一个。
为了说明这一点,我编译并运行了以下代码:int foo(long a)
{
return foo(a-1);
}
int main()
{
return foo(9999999999L);
}
在我的GCC/bubutu机器上。这个程序有无限递归,最终导致"分段错误"崩溃。
可以将任何递归算法转换为迭代算法。不要用新变量递归地调用函数,而是使用STL std::stack
来推入和弹出它们并在循环中运行。以下是详细信息:http://www.cplusplus.com/reference/stl/stack/
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?