调用方法时执行停止

Execution Stops when Method is called

本文关键字:执行 方法 调用      更新时间:2023-10-16

我对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 后不应该崩溃吗?

谁能阐明这一点?