2016-06-04 2 views
0

Я относительно новичок в программировании на 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 ; 
} 
+1

Не знаете, как этот код работает, так как он даже не компилируется. Отличная возможность [научиться использовать отладчик] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+0

В показанном коде есть несколько ошибок. Для начала цикл 'for' в' mergeArrays'() является бесконечным циклом, так как 's' всегда останется 0. Ничто не увеличивает переменную цикла. Тогда сравнения 'if' внутри цикла имеют очевидные граничные условия, которые приводят к неопределенному поведению. Этот код является хорошим началом, но 'mergeArrays'() необходимо полностью переписать; но только после [обсуждения вашего предлагаемого кода с вашей резиновой утиной] (https://en.wikipedia.org/wiki/Rubber_duck_debugging). Не пишите ни одной строки, пока ваша резиновая утка не согласится с вами. –

ответ

0

Посмотрите на свой for цикл в mergeArrays()

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

Вы определяете переменную цикла, s; вы проверяете условие цикла на s, но вы увеличиваете другую переменную, i.

Посмотрите на полный цикл, и вы увидите, что вы никогда не изменяете s.

Таким образом, цикл должен продолжаться вечно.

Но я удивлен, что программа не сработает, потому что она может писать в mArr[i+j], с i очень высоко.

p.s .: Извините за мой плохой английский

0

Спасибо за ваши ответы, все

Я сделал две ошибки. Во-первых,

для (Int S = 0, S < leftArraySize + rightArraySize; я ++)

я ++ должен быть заменен с ++

Во-вторых,

, если (leftArray [I] < rightArray [J] || J == rightArraySize + leftArraySize) должен быть заменен, если (leftArray [I] < rightArray [J] || J == rightArraySize)

Как указывалось ранее, i ++ вызывает неопределенный цикл, который приводит к сбою программы.

Но мне все еще любопытно, почему не удается добраться до DEBUG POINT 2?

DEBUG POINT 2 в Sort(), перед тем, как мы введем неопределенный цикл в MergeSort(), не должен сбой программы после наименьшей печати DEBUG POINT 2 на выходе.

Может ли кто-нибудь пролить свет на это?