执行在调用Method时停止

时间:2016-06-04 00:50:07

标签: c++

我对C / C ++编程相对较新,我正在通过开发合并排序代码来练习。

但是当我在代码中调用mergeArrays()函数时,程序执行就会停止。我正在使用Eclipse IDE。

情况1 - 现在,从sort(),如果我调用mergeArrays()程序执行停止。 我只能访问Debug Point1,eclipse在到达Debug point 2或3之前挂起。

情况2 - 然而,当不从sort()调用mergeArrays()时,通过注释掉对mergeArrays的调用。程序执行完成(显然,我得到了所需的结果。) 在情境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);

};

文件 - MergeSort.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 ;
}

2 个答案:

答案 0 :(得分:0)

查看nvprof --print-gpu-trace ...

中的for周期
mergeArrays()

您定义了一个循环变量for(int s =0 ; s < leftArraySize + rightArraySize; i++) ;您根据s 测试循环条件,但增加另一个变量s

查看完整周期,您可以看到永远不会修改i

所以周期应该永远持续下去。

但我很惊讶程序没有崩溃,因为它可以写入smArr[i+j]非常高。

p.s:抱歉我的英语不好

答案 1 :(得分:0)

感谢大家的回复,

我犯了两个错误。 首先,

for(int s = 0; s&lt; leftArraySize + rightArraySize; i ++)

i ++应该被s ++替换

其次,

if(leftArray [i]&lt; rightArray [j] || j == rightArraySize + leftArraySize) 应该被替换 if(leftArray [i]&lt; rightArray [j] || j == rightArraySize)

如前所述,i ++导致无限循环崩溃程序。

但我仍然很好奇,为什么不能达到DEBUG POINT 2?

Sort()中的

DEBUG POINT 2,在我们在MergeSort()中输入无限循环之前,在输出中至少打印DEBUG POINT 2之后程序不应该崩溃。

有人能说清楚吗?