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 simplesSegmentation 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!