我对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;
}
class CMergeSort{
public:
int* sort(int *mArray,int mArraySize);
int* mergeArrays(int* leftArray,int leftArraySize, int* rightArray,int rightArraySize, int* mArr);
};
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 ;
}
答案 0 :(得分:0)
查看nvprof --print-gpu-trace ...
for
周期
mergeArrays()
您定义了一个循环变量for(int s =0 ; s < leftArraySize + rightArraySize; i++)
;您根据s
测试循环条件,但增加另一个变量s
。
查看完整周期,您可以看到永远不会修改i
。
所以周期应该永远持续下去。
但我很惊讶程序没有崩溃,因为它可以写入s
,mArr[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之后程序不应该崩溃。
有人能说清楚吗?