Я относительно новичок в программировании на C/C++, и я практиковал разработку кода для сортировки merge.Выполнение Остановка при вызове метода
Но когда я вызываю функцию mergeArrays() в моем коде, выполнение программы останавливается. Я использую Eclipse IDE.
Ситуация 1 - Теперь, из sort(), если я вызываю выполнение mergeArrays(), выполнение программы останавливается. Я могу достичь только Debug Point1, затмение eclipse до того, как оно достигнет точки отладки 2 или 3.
Ситуация 2 - Однако, если вы не вызываете mergeArrays() из sort(), комментируя вызов mergeArrays. Программа выполняется до завершения (очевидно, я получаю желаемый результат.) В ситуации 2 я могу достичь всех 3 точек отладки.
Я не беспокоюсь о корректности кода, но более заинтересованы в попытке выяснить, почему mergeArrays вызова() из рода(), влияющие на вызов сортировки() себя в ситуации 1.
Вот код
Главная Файл
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 ;
}
Не знаете, как этот код работает, так как он даже не компилируется. Отличная возможность [научиться использовать отладчик] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –
В показанном коде есть несколько ошибок. Для начала цикл 'for' в' mergeArrays'() является бесконечным циклом, так как 's' всегда останется 0. Ничто не увеличивает переменную цикла. Тогда сравнения 'if' внутри цикла имеют очевидные граничные условия, которые приводят к неопределенному поведению. Этот код является хорошим началом, но 'mergeArrays'() необходимо полностью переписать; но только после [обсуждения вашего предлагаемого кода с вашей резиновой утиной] (https://en.wikipedia.org/wiki/Rubber_duck_debugging). Не пишите ни одной строки, пока ваша резиновая утка не согласится с вами. –