Anzeige:
Ergebnis 1 bis 2 von 2

Thema: [C++] Komischer Fehler - sucht nach einem helfenden Loeser !!!

  1. #1
    Registrierter Benutzer Avatar von Raute50
    Registriert seit
    08.01.2005
    Ort
    GÖttingen
    Beiträge
    39

    Question [C++] Komischer Fehler - sucht nach einem helfenden Loeser !!!

    Hi ho ...

    als erstes moechte ich noch erwaehnen, dass ich hier zwar viel geschrieben habe, das Problem aber eher komisch als kompliziert ist !!!


    Habe ein komisches Problem! Habe mir eine Sortierungsklasse geschrieben ( nix besonderes ). Desweiteren habe ich mich die Klassen DoppelVektor und DreifachVektor geschrieben, die als Eintrag 2 bzw. 3 Zahlen ( long ) beinhalten..

    Ich lese ein Mal Zweier-Paare aus einer Datei ein und speichere sie in einem vector < DoppelVektor > und will sie dann sortieren => Klappt!

    Habe ich dagegen Dreier-Paare in einem vector < DreifachVektor > gespeichert und moechte diese sortieren => Abbruch !
    gdb liefert folgende Zeile: Program received signal SIGSEGV, Segmentation fault.

    im Code konnte ich es m.E. auf folgende Zeile eingrenzen :

    Code:
    while (dasfeld[lambda2] < pivot_elem) ( ... tue geeignetes ... )
    ... dabei ist das pivot_elem durch einen Kopierkonstruktor in's Leben gerufen worden :
    Code:
    T pivot_elem( dasfeld[pivot_ind]);
    dasfeld ist vom Datentyp vector und beinhaltet entweder DoppeltVektor-Eintraege oder DreifachVektor-Eintraege, je nachdem, was ich halt sortieren moechte.
    Bei beiden KLassen habe ich KEINEN [] Operator!
    Laut gdb ist der <-Vergleich der Ausloeser ,,, aber ich tippe eher auf einen Zusammenhang im Bezug auf den []-Operator

    Die Sortierungsklasse hat folgende Parameter:
    Code:
    template <class T> class sorter {
    	private:
    		vector <T> dasfeld;
    		long laenge;
    	public:
    		... halt Funktionen und so'n Zeugs ...
    }
    Die Aufrufe laufen also wie folgt ab :
    Code:
    sorter <DoppelVektor> thesorter(the_vec, the_vec.size());
    wobei the_vec vom Datentyp vector ist und
    Code:
    sorter <DreifachVektor> pkq_sort ( pkq , pkq.size());
    wobei pkq vom Datentyp vector ist.


    Ein paar Textbeispiele sind :
    Code:
    	vector <DoppelVektor> the_vec;
    	long eins, zwei;
    	ifstream auslesen;
    	auslesen.open("./temp.txt", ios::in);
    	bool lies_weiter = true;
    	long stamplen;
    
    	long uu = 1;
    	long anzahl_von_gelesenen_stamps = 25; // OBACHT temporaere Variable
    	// ...damit die ersten Listen nicht zu lang sind
    		
    	// lese solange weiter ein, solange sinnvolle Stamps und zugehoerige Primzahlen existieren
    	while ( lies_weiter ){
    		uu++;
    		auslesen >> eins >> zwei;
    		if ( eins == 0 ) 
    			lies_weiter = false;
    		else {
    			// zum Vergleich mit anderem Programm folgende If-Bedingung eingebaut
    			if (  eins <= 722111111  ) {
    				if ( uu > 0 ) {
    					cout << "Zum ersten Mal bei Nr " << uu << endl;
    					uu = 0;
    					cout << zwei << endl;
    					cout << eins << endl;
    				}
    				DoppelVektor tempvek ( zwei , eins);
    				the_vec.push_back(tempvek);
    				uu -= 2 ;
    				if ( uu < -anzahl_von_gelesenen_stamps )
    					lies_weiter = false;
    				cout << "uu = " << uu << endl;
    			}
    	
    		}
    	
    	}
    	sorter <DoppelVektor> thesorter(the_vec, the_vec.size());
    	thesorter.dump2(); // unsortierte Ausgabe
    	cout << "*" << endl;
    	thesorter.sort(0, thesorter.get_laenge()-1, false);
    	cout << "*" << endl;
    	thesorter.dump2(); // sortierte Ausgabe
    	return 0;
    liefert folgende Ausgabe :
    Zum ersten Mal bei Nr 358
    2147418001
    433101011
    uu = -2
    ...
    uu = -26
    SORTER DUMP 2 ( hier nur ein Auszug : )
    Stamp = 433101011 und Wert = 2147418001
    Stamp = 643011001 und Wert = 2131272001
    Stamp = 122201111 und Wert = 2129522851
    ...
    Stamp = 343200011 und Wert = 1734453001

    *
    *
    SORTER DUMP 2 ( hier nur ein Auszug : )
    Stamp = 721200111 und Wert = 2096760961
    Stamp = 721111110 und Wert = 1862340481
    Stamp = 711011111 und Wert = 2039706241
    Stamp = 701211011 und Wert = 1959717761
    Stamp = 643011001 und Wert = 2131272001
    ...
    Stamp = 122201111 und Wert = 2129522851
    scheint also alles geklappt zu haben ....

    dagegen geht es beim DreifachVektor leider nicht !


    Kann mir einer erklaeren, woran das liegen kann ???

    Habe ein kleines Beispielprogramm dazu auf DIESER Seite hinterlegt!

    Ich waere euch ECHT dankbar, wenn ihr mir hilfreiche Kommentare geben koenntet !!!


    Schoenen Abend noch !

    #50

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Die Vergleichsoperatoren ("operator<" und "operator>") deiner DreifachVektor Klasse sind zumindest schon mal komisch geschrieben. Die liefern nämlich immer "true" zurück, und zwar weil sowohl -1 als auch 1 konvertiert nach bool true ergibt. Ich halte es für wahrscheinlich das du deshalb an der beanstandeten Stelle über die Grenzen des Vektors hinausschiesst. Für eine definitive Antwort habe ich aber dein Programm nicht genau genug angeschaut.

    Ein Tipp von mir ist, das du deine < und > Operatoren so schreibst, dass sie eine "Strict Weak Order" ergeben. Dann bisst du auch gleich mit der Standardbibliothek kompatibel. Was das ist kannst du z.B. hier nachlesen:
    http://www.dinkumware.com/manuals/de...e=lib_stl.html

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •