2016-05-08 10 views
0

Das ist mir nie passiert und ich habe keine Ahnung, wie ich es beheben kann. Es heißt nur "Unhandled Ausnahme bei 0x003714e9 in Quick.exe: 0xC00000FD: Stapelüberlauf." Dann bricht es ab und es hebt die Klammer hervor und zeigt einen Pfeil daneben, was meiner Meinung nach bedeutet, dass sich der Fehler dort befindet. P.S. Die Halterung ist in fettUnbehandelte Ausnahme bei 0x003714e9 in Quick.exe: 0xC00000FD: Stapelüberlauf

#include<iostream> 
using namespace std; 

int partition(int data[], int left, int right) 
**{** 
    int pivot = data[left]; 
    while(true) 
    { 
     while(data[left] < pivot) 
     { 
      left++; 
     } 
     while (data[right]>pivot) 
     { 
      //find smaller value than pivot from top array 
      right--; 
     } 

     if(left < right) 
     { 
      //change pivot place 
      int temp = data[right]; 
      data[right] = data[left]; 
      data[left] = temp; 
     } 
     else 
     { 
      return right; 
     } 
    } 
} 

void quickSort (int *data, int left, int right) 
{ 

    if(left<right) 
    { 
     int cut = partition(data, left, right); 
     if(cut>1) 
     { 
      quickSort(data, left, right); 
     } 
     if(cut+1<right) 
     { 
     quickSort(data, cut+1, right); 
     } 
    } 
} 

void quickSort(int *data, int length) 
{ 
    quickSort(data, length-length, length-1); 
} 


void print_array(int array[], int size) //this function is to print the array after we finish sorting and we can use it before the sorting begin 
{ 
    int j; 
    for (j=0; j<size; j++) 
    cout <<" "<< array[j]<<endl; 

}//end of print_array 

int main() 
{ 
    const int size = 5; 
    int arr[size]= {1, 17, 4, 6, 20}; 
    quickSort(arr, 0, size); 
    print_array(arr, size); 
    system("pause"); 
    return 0; 
} 
+0

Höchstwahrscheinlich unkontrollierte Rekursion. Stellen Sie sicher, dass Ihr Base Case Sound ist. – stackptr

+0

Nun habe ich alles überprüft, aber ich kann keinen Fehler sehen, nicht dass mein Code perfekt ist, aber ich bin gerade blind: P – magician

+0

Ich empfehle Ihnen, einen Tracepoint in Visual Studio einzufügen und "Drucken eine Nachricht "und dann' {$ CALLSTACK} 'bei Ihrer Quicksort-Funktion eingeben. Es wird die Ausführung verlangsamen, aber Sie erhalten das Protokoll der Aufrufe im Ausgabefenster. – sergiol

Antwort

0

denke ich, das Hauptproblem hier liegt:

if(cut>1) 
{ 
    quickSort(data, left, right); 
} 

Sie die Funktion immer wieder zwischen links/rechts aufrufen. Vielleicht solltest du hier statt right verwenden? Und tatsächlich, vergleichen Sie die cut mit left dann, wie Sie mit right tun ...

Die „beschädigtem Stapel“ Fehler nach der ersten Ausgabe Fixierung ist, weil die main() die QuickSort Funktion mit falschen Parametern aufrufen - es sollte entweder

quickSort(arr, 0, size-1); 

oder

quickSort(arr, size); // the overload handling the -1 

auch der length-length Ausdruck in der überladenen Funktion ist relativ gewundener Wegzu schreiben.

Sie können auch den Code ändern, um tatsächlich die Größe als right zu nehmen, aber dann beginnen immer bei right-1 (dies ist, wie std Algorithmen, die Iteratoren nehmen in der Regel arbeiten, so dass end() passieren, die nach dem letzten Array-Elemente ist).

+0

Ah danke dafür. Wir haben den Fehler durchlesen können, auf den ich mich bezogen habe, aber jetzt gab es einen weiteren Fehler, der besagt, dass "Run-Time Check Failure # 2 - Stack um die Variable 'arr' fehlerhaft war." mit einem Pfeil, der auf die schließende Klammer der Hauptfunktion zeigt – magician

+0

Hinzugefügt die Ursache des beschädigten Stapelproblems ^^ – axalis

+0

Alles funktioniert jetzt gut Chef. Ich schätze deine Hilfe sehr. Ich habe immer noch eine Frage, ich muss viel besser programmieren, was soll ich tun? – magician