Programm stürzt nach Algorithmus ab



  • Hi,
    ich hab ein Programm geschrieben was int-werte Zeilenweise aus einer Datei einliest und sie in ein array speichert was ich dynamisch mit <vector> erzeugt hab.
    dieses array will ich mit dem INSERTION-SORT Algorithmus sortieren,aber es stürzt wärend der Laufzeit immer ab.
    Saß jetzt schon ne ganze weile dran finde dort keinen fehler 😡 .
    Bitte um hilfe,stell ma den code rein.
    MFG Steve

    #include "stdafx.h"
    #include <fstream>
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace System;
    using namespace std;
    
    int main()
    {
    
    ifstream quelle;
    string quelldateiname;
    cout << "Quelldatei?...(Kompletten Pfad angeben!!)"<<endl;
    cin >> quelldateiname;
    
    quelle.open(quelldateiname.c_str(), ios::in);
    
    if(!quelle)
    	{
    	cerr << quelldateiname << "kann nicht geoeffnet werden!" <<endl;
    	exit(-1);
    	}
    
    cout << "Name der zu erstellenden Zieldatei?..."<<endl;
    string zieldateiname;
    cin >> zieldateiname;
    ofstream ziel(zieldateiname.c_str(),ios_base::out|ios_base::in|ios_base::app);
    
    if(!ziel)
    	{
    	cerr << zieldateiname <<"kann nicht geoeffnet werden!"<<endl;
    	exit(-1);
    	}
    
    //erzeugung eines dynamischen arrays mit "vector"
    vector<int> feld;
    int value;
    while(quelle >> value)
    	{
    	feld.push_back(value);
    	}
    
    //INSERTION-SORT
    //zuerst den kleinsten wert auf feld[0] setzten
    
    int min = 0;
    int x =  0;
    unsigned int k,i,j,h;
    
    for(k=1 ; k < feld.size() ; k++)
    	if(feld[k] < feld[min])
    		min = k;
    
    //werte austauschen
    x = feld[0];
    feld[0] = feld[min];
    feld[min]= x;
    
    //eigentlicher INSERTION-SORT Algorithmus
    int key;
    for(j =2 ; j <= feld.size() ; j++)
    	{
    	key = feld[j];
    	i= j-1;
    	while( i> 0 && feld[i] > key)
    		{
    		feld[i+1] = feld[i];
    		i--;
    		}
    		feld[i+1] = key;
    	}
    
    //for-schleife um array in zieldatei zu schreiben
    for(h = 0; h <= feld.size(); h++)
    	{
    	feld[k] >> ziel;
    	}
    
    quelle.close();
    ziel.close();
    
    cout <<"...Zeahlvorgang abgeschlossen..."<<endl;
    


  • An welcher Stelle stürzt es ab und mit welcher Fehlermeldung?



  • Also am unteren Ende fehlt bei deinem Queletxt die } von main, hoffe da haste nich noch was anderes beim kopieren evrgessen. Ich nehme an dein programm geht einfach aus? Schreib mal cin.get(); 2x unter dein letztes cout.

    Falls es das nicht ist wäre eine genauere Beschreibung hilfreich.



  • In Zeile 66 und 77 läuft die Schleife über die Feldgrenzen hinaus.
    falsch:

    for(j =2 ; j <= feld.size() ; j++)
    

    richtig:

    for(j =2 ; j < feld.size() ; j++)
    

    Edit: meine Zeile 66 u. 79



  • Hi,
    erstma danke an alle.....
    Prog funzt jetzt!
    @Xebov....die } hab ich nur beim Kpieren vergessen 😃
    @MIP.... du hattest recht da lag der Fehler,klar das es da abstürtzt wenn die Array Grenzen verletzt werden...
    🙄

    Gruß steve



  • Wenn du das ganze mit der std::vector::at(int element)-Methode machst wird dir eine std::out_of_range exception geworfen, die du evtl. schneller gefunden hättest.



  • Nachtrag:
    Eigentlich nicht nur eventuell, normalerweise sogar ziemlich sicher.
    Weiß ja nicht wie das unter windows ist, aber über den Index operator bekomm ich in der Bash-Konsole hier ein simples

    Segmentation Fault

    ausgespuckt, mit dem at ein ganzes

    terminate called after throwing an instance of 'std::out_of_range'
    what(): vector::_M_range_check
    Aborted"



  • Hy,

    Oder du nimmst gleich Iteratoren, dann würde dir nen 0-Pointer sowieso alles kaputt machen wenn du das Ende falsch abprüfst 😉 Wäre etwas offentsichtlicher.

    Mfg Marco



  • hi,
    und zwar wollte ich das programm jetzt unter linux compilieren und am anfang 2 komandozeilenparameter mit übergeben.
    Aber wieder stürzt es ab 😞
    Hab es schon geändert weil ja manche Befehle in Linux nicht so recht funktionieren.
    Bitte um hilfe,hier der Code:

    #include <fstream>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main(int argc,char *argv[])
    {
    char *input;
    char *output;
    char in[10]="input.txt";
    char out[11]="output.txt";
    //test ob parameter übergeben werden
    if(argc > 0)
    	{
    	input = argv[1];
    	output = argv[2];
    	}
    else
    	{
    	input = in;
    	output = out;
    	}
    
    fstream quelle;
    quelle.open(input, ios::in);
    
    fstream ziel(output, ios::out);
    
    //erzeugung eines dynamischen arrays mit "vector"
    vector<int> feld;
    int value;
    while(quelle >> value)
    	{
    	feld.push_back(value);
    	}
    
    //INSERTION-SORT
    
    unsigned int k,i,j;
    
    //eigentlicher INSERTION-SORT Algorithmus
    int key;
    for(j =1 ; j < feld.size() ; j++)
    	{
    	key = feld[j];
    	i= j-1;
    	while( i> 0 && feld[i] > key)
    		{
    		feld[i+1] = feld[i];
    		i--;
    		}
    		feld[i+1] = key;
    	}
    
    //for-schleife die sortiertes array in datei schreibt
    for(k=0 ; k < feld.size(); k++)
    ziel << feld[k] << endl;
    
    //geöffnete datein schließen
    quelle.close();
    ziel.close();
    
    }
    

    MFG Steve



  • Hab es schon geändert weil ja manche Befehle in Linux nicht so recht funktionieren.

    lol?! bzgl C++ bestimmt nicht...

    char *input;
    char *output;
    char in[10]="input.txt";
    char out[11]="output.txt";
    //test ob parameter übergeben werden
    if(argc > 0)
        {
        input = argv[1];
        output = argv[2];
        }
    else
        {
        input = in;
        output = out;
        }
    

    das ist hässlich und falsch...

    char *input;
    char *output;
    
    const char in[]="input.txt"; //besser wäre aber const std::string und dann
    const char out[]="output.txt"; //input = in.c_str(); zu nutzen - aber hier gehts auch so klar...
    

    oder willst du jedesmal die zeichen selbst zählen, wenn du was änderst?

    if(argc > 0)
    

    ist immer größer 0 (mind. 1, da argv[0] die working directory ist)

    char *input;
    char *output;
    
    if (argc >= 3)
    {
        input = argv[1];
        output = argv[2];
    }
    else
    {
        input = in;
        output = out;
    }
    

    bb

    PS: Debugger!


Anmelden zum Antworten