调用方法时执行停止
Execution Stops when Method is called
我对C/C++编程相对较新,我正在通过开发合并排序代码来练习。
但是当我在代码中调用 mergeArrays() 函数时,程序执行停止。我正在使用Eclipse IDE。
情况 1 - 现在,从 sort(),如果我调用 mergeArrays() 程序执行停止。我只能到达调试点 1,日食在到达调试点 2 或 3 之前挂起。
情况 2 - 但是,当不要从 sort() 调用 mergeArrays() 时,通过注释掉对 mergeArray 的调用。程序执行完成(显然,我确实得到了想要的结果。在情况 2 中,我可以达到所有 3 个调试点。
我不担心代码的正确性,但更感兴趣的是试图找出为什么在情况 1 中从 sort() 调用 mergeArrays() 会影响对 sort() 本身的调用。
这是代码
主文件
int main(){
int Arr = {3,2,4,1,5,6} ;
int ArraySize = 6
CMergeSort mergesort;
cout << "Debug Point 1" << endl;
mergesort.sort(Arr,ArraySize);
cout << "Debug Point 3 " << end;
// Print the Sorted List
for(int k=0; k < ArraySize ;k++)
{
cout << Arr[k] << endl ;
}
return 0;
}
文件 - MergeSort.h
class CMergeSort{
public:
int* sort(int *mArray,int mArraySize);
int* mergeArrays(int* leftArray,int leftArraySize, int* rightArray,int rightArraySize, int* mArr);
};
文件 - 合并排序.cpp
int* CMergeSort::sort(int* mArray, int mArraySize)
{
if(mArraySize < 2)
{
return mArray ;
}
cout << "Debug Point 2 "<< endl ;
int mid = mArraySize/2 ;
int left_array[mid] = {} ;
int right_array[mArraySize - mid] = {};
for(int i = 0 ; i< mid;i++) // left array size = mArraySize - mid
{
left_array[i] = mArray[i] ;
}
for(int j = 0 ;j< mArraySize - mid;j++) // right arr size= mArraySize - mid
{
right_array[j] = mArray[mid+j] ;
}
sort(left_array,mid);
sort(right_array, mArraySize - mid);
mergeArrays(left_array, mid, right_array, mArraySize - mid, mArray);
return mArray;
}
int* CMergeSort::mergeArrays(int* leftArray,int leftArraySize, int* rightArray,int rightArraySize, int* mArr)
{
int i = 0 ; // left array tracker
int j = 0 ; // right array tracker
int k = 0 ; // main array tracker
for(int s =0 ; s < leftArraySize + rightArraySize; i++)
{
if(leftArray[i] < rightArray[j] || j == leftArraySize + rightArraySize)
{
mArr[i+j] = leftArray[i] ;
i++ ;
k++ ;
}
if (leftArray[i] > rightArray[j] || i == leftArraySize + rightArraySize )
{
mArr[i+j] = rightArray[j];
j++;
k++;
}
}
return mArr ;
}
看看你的for
周期mergeArrays()
for(int s =0 ; s < leftArraySize + rightArraySize; i++)
你定义了一个循环变量,s
;你根据s
测试循环条件,但你递增另一个变量,i
。
查看整个周期,您会发现您永远不会修改s
。
所以这个循环应该永远持续下去。
但我很惊讶该程序没有崩溃,因为它可以用 mArr[i+j]
写入,i
非常高。
PS:对不起,我的英语不好
谢谢大家的回复,
我犯了两个错误。第一
for(int s =0 ; s
i++ 应该被 S++ 取代
其次
if(leftArray[i] <rightArray[j]>
如前所述,i++ 会导致程序崩溃的无限循环。
但我仍然很好奇,为什么无法达到调试点 2 ?
Sort()中的调试点 2 出现在我们在 MergeSort() 中进入无限循环之前,程序至少在输出中打印调试点 2 后不应该崩溃吗?
谁能阐明这一点?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 如何使父类不重复已经执行的祖父方法
- 如何将带有参数的方法传递给线程以执行?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 在 c++ 中从执行的 shell 命令获取返回状态的安全方法是什么?
- 在高通六边形处理器的word32上执行水平求和的最快方法是什么
- 在C++中执行方法的同一行中传递指针
- 在 MySQL 连接器C++ API 中使用一个函数调用执行多个查询的正确方法是什么?
- 如何执行重写的方法C++
- 基于整数向量执行位排列的有效方法?
- 执行模板参数包指向的所有方法
- cppUnit:针对多个测试方法执行一次的设置函数
- C++对象的 WMI 执行方法
- 为什么在从线程执行方法时使用QMetaObject::invokeMethod
- 执行方法调用时,有什么理由不C++中添加嵌套类/结构解析
- 有没有办法让C++类在开始执行析构函数之前自动执行方法
- 分段错误执行方法
- 只要发现字符,C++就会搜索并执行方法