2017-01-04 6 views
0

Also habe ich kürzlich von Java auf C++ umgestellt und erstelle ein Auswahlbeispiel, um die Vector-Bibliothek ein wenig besser kennenzulernen. Wenn ich jedoch versuche, das Programm auszuführen, gibt es keine Buildfehler, aber zwei Fehler beim Debuggen.Visual Studio wirft eine Menge Debugging-Fehler bei dieser Auswahl.

enter image description here

enter image description here

Nach ignorieren klicken, erhalte ich eine Tonne Warnungen wie diese:

enter image description here

Ich bin noch ziemlich neu in C++, so habe ich keine Ahnung, was verursacht diese Fehler und jede Hilfe würde sehr geschätzt werden. Hier ist der Code, den ich geschrieben habe, danke im Voraus. Wenn Sie weitere Informationen wünschen, fragen Sie bitte und ich werde zur Verfügung stellen, was benötigt wird.

#include <stdlib.h> 
#include <vector> 
#include <iostream> 
using namespace std; 

int findLowest(vector<int> in) { 

    int min = in[0]; 
    int index = 0; 

    for (int i = 1; i < in.size(); i++) { 
     if (in[i] < min) { 
      min = in[i]; 
      index = i; 
     } 
    } 

    return index; 
} 

void printVector(vector<int> in) { 
    vector<int>::iterator v = in.begin(); 
    while (v != in.end()) { 
     cout << *v << endl; 
     v++; 
    } 
} 

vector<int> selectionSort(vector<int> toSort) { 
    vector<int> temp; 

    for (int i = 0; i < toSort.size(); i++) { 
     int tempIndex = findLowest(toSort); 
     temp.push_back(toSort[tempIndex]); 
     temp.erase(temp.begin() + tempIndex); 
    } 

    return temp; 
} 

vector<int> randomArray(int size) { 
    vector<int> temp; 
    for (int i = 0; i < size; i++) { 
     temp.push_back(rand() % 100); 
    } 
    return temp; 
} 

void main() { 
    vector<int> toSort = randomArray(20); 
    printVector(toSort); 

    vector<int> sorted = selectionSort(toSort); 
    printVector(sorted); 

    cin.ignore(); 
} 
+1

Sie sollten dies im Debug-Modus mit aktiviertem Debugger ausführen. siehe [Wie man kleine Programme debuggt] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+1

Ich möchte auch darauf hinweisen, dass Sie wahrscheinlich unnötige Kopien Ihrer Arrays erstellen. Im Gegensatz zu Java werden alle Parameter unabhängig vom Typ als Wert übergeben. In Ihrem Fall wird Ihr toSort-Array * kopiert *, wenn 'selectionSort' aufgerufen wird. Wenn Sie nur eine Referenz benötigen (oder noch besser: eine konstante Referenz), müssen Sie dies explizit tun, z.'selectionSort (const vector & toSort)' – CygnusX1

+0

Um auf das, was @ CygnusX1 sagte, aufzubauen, siehe [dieses Beispiel von pass-by-value und pass-by-reference] (http://ideone.com/IXr4xz). –

Antwort

2

Ihre selectionSort Funktion wierd ist, würde ich std::sort verwenden.

Wie dem auch sei, ersetzen:

for (int i = 0; i < toSort.size(); i++) { 
    int tempIndex = findLowest(toSort); 
    temp.push_back(toSort[tempIndex]); 
    temp.erase(temp.begin() + tempIndex); 
} 

von:

size_t size = toSort.size(); 
for (size_t i = 0; i < size; i++) { 
    int tempIndex = findLowest(toSort); 
    temp.push_back(toSort[tempIndex]); 
    toSort.erase(toSort.begin() + tempIndex); 
} 

Ihre seg Fehler zu beheben und haben Ihre Behälter sortiert.

Beachten Sie, dass Größe in einer Variablen durch Speichern Sie sicherstellen, dass Sie 20 Wiederholungen tun ... nicht 10 ...

Auch, wie von Adrian size_t (unsigned) kommentiert sollte auch nicht int verwendet werden (gleiche Kommentar für findLowest)

das nächste Mal, verwenden Sie einen Debugger, sollte es diese leicht zu erkennen heraus haben durch so tun ... ;-)

+0

Das war ein guter Haken, ich änderte den Code zu diesem und alle Fehler sind verschwunden. Die Sortierfunktion sortiert jedoch nicht richtig haha. Ich werde deine Antwort richtig markieren, sobald es mir erlaubt. Vielen Dank! –

+1

@OmerEldar: Siehe meine Bearbeitung. das funktioniert. – jpo38

+1

Wenn Sie jemals die Compiler-Warnstufe erhöhen möchten, müssen Sie sich von der Gewohnheit abwenden, 'int' für die Größen von Standardcontainern zu verwenden. In 32-Bit konvertieren Sie implizit zwischen Vorzeichen und Ganzzahlen ohne Vorzeichen. In 62-Bit schneiden Sie auch ab. –

4

Klicken Sie auf Pause, so dass es Sie, wo das Programm zeigen können, habe den Fehler gefunden.

Es wird Sie den Call-Stack zeigen: enter image description here

Klicken Sie doppelt auf einer Linie, die nicht ausgegraut (Code) ist.

Dann werden Sie Ihren Code sehen und Sie können einige Datenansichten hinzufügen (oder eine Uhr hinzufügen, oder einfach nur mit der Maus bewegen): enter image description here

Von hier kann man sehen, dass der temp Vektor, der eine Größe hat von 1, aber die tempIndex Variable hatte einen Wert von 3, was bedeutet, dass der Aufruf an erase() außerhalb des Bereichs wie die Fehlermeldung erwähnt wird.

Verwandte Themen