【发布时间】:2020-01-27 19:05:21
【问题描述】:
我正在尝试基于为我的编程课程提供的伪代码实现排序算法,而我和我的合作伙伴一直在遇到(核心转储)错误,通常是分段错误。我知道这通常意味着程序正在尝试访问它不允许访问的内存,但我不确定如何解决这个问题。
#include <iostream>
#include <cmath>
using namespace std;
void FlipFlopSort(int *Array, int begin, int end){
int length = (end-begin);
float midh = 2*(float)length/3;
midh = ceil(midh);
float midl = (float)length/3;
midl = ceil(midl);
//cout << "size of sorted area = " << length << endl;
if(length<=2){
//cout << "Length = 2" << endl;
if(Array[begin] > Array[begin+1]){
swap(Array[begin], Array[begin+1]);
}
}else{
//cout << "Recursion Begin 1" << endl;
FlipFlopSort(Array, begin, midh);
//cout << "Recursion End" << endl;
FlipFlopSort(Array, midl, end);
//cout << "Recursion Begin 2" << endl;
FlipFlopSort(Array, begin, midh);
}
}
int main(){
// Declare Variables and Read Inputs
int n;
cin >> n;
int Array[n];
for(int i = 0; i < n; i++){
cin >> Array[i];
}
FlipFlopSort(Array, 0, n);
for(int i = 0; i<n; i++){
if(i != (n-1)){
cout << Array[i] << " ";
}else{
cout << Array[i] << endl;
}
}
return 0;
}
【问题讨论】:
-
是时候启动调试器并调试您的代码了。这是了解正在发生的事情的最佳方式。
Array[n]在 C++ 中也无效,即使某些编译器扩展支持它。使用正确的容器std::vector。 -
你有没有机会使用 code:blocks 并且没有像样的调试信息?
-
我刚刚尝试调试我的程序并收到一条新消息,但我不太明白:它指出 std::ceil 中存在分段错误 0x0000555555554d35。然后继续说我无法在 /usr/include/c++/7/cmath:166 访问内存
-
这是您向下查看堆栈以查找代码中哪里出错的地方。
-
在您的调试器中应该有一种方法可以将调用堆栈向上传递到您的代码。当您编写代码时,它应该向您显示崩溃发生时程序的哪一行正在运行。在 Visual Studio 中,调试工具栏上有一个
Stack Frame组合框和一个调用堆栈窗口/视图。这两者都允许您向上/切换调用堆栈。
标签: c++ sorting segmentation-fault coredump