Probleme mit Initialisierungsliste



  • Servus,

    ich finde da gerade nicht den Fehler. Ich rufe meine Testmethode auf und komme bis zum Aufruf des H2r-Konstruktors ... da müsste doch nun die Debugmeldung ausgegeben werden, aber ich erhalte eine Fehlermeldung. Danke vorab für eine Anregung. Es scheint da zwar nun etwas zu geben mit einer Bibliothek, aber von Debugmeldung 2 auf Debugausgabe 3 ist diese Bibliothek gar nicht am Start oder ?!

    H2r ist der Konstruktor der aufgerufen werden soll, aber der Fehler erscheint.

    Die Konsolenausgabe ist bis zum Fehler wie erwartet:
    DEBUG-BP 1
    ... Tags 4
    Msa.toString() [ 4 Sequenzen, 4 Spalten ]
    t | YLKG
    t | YLEG
    t | YLEG
    t | FLNG

    DEBUG-BP 2

    /home/joba/jobaprogramme/seqan_bioinf/Seqan_Release_1.3/seqan/sequence/string_base.h:237 Assertion failed : static_cast<TStringPos>(pos) < static_cast<TStringPos>(length(me)) was: 0 >= 0 (Trying to access an element behind the last one!)

    class H2r {
    
    private:
        Msa msa;
        Msa msaToCompare;
    
    public:
    
        /**
         * Konstruktor mit Initialisierungsliste, siehe Breymann S. 158.
         * 
         * @param m
         */
        H2r( Msa& m ) : msa(m){ 
    
            std::cout << "MSA-Konstruktor ..." << std::endl;
            //cout << msa.toString() << endl;
    
        }
    // ++++++++++++++++++++++++++++++++++++++++
    
    void testH2rGetCurrentSingleEntropy(){
    
        cout << "testH2rGetCurrentSingleEntropy() ... \n";
        // Test 1
        // Fixture 1: Mini-MSA auf genaue Ergebnis-Werte testen
        seqan::StringSet< seqan::CharString > test1Seqs;
        seqan::CharString str1Test1 = "YLKG";
        seqan::CharString str2Test1 = "YLEG";
        seqan::CharString str3Test1 = "YLEG";
        seqan::CharString str4Test1 = "FLNG";
        seqan::appendValue( test1Seqs, str1Test1 );
        seqan::appendValue( test1Seqs, str2Test1 );
        seqan::appendValue( test1Seqs, str3Test1 );
        seqan::appendValue( test1Seqs, str4Test1 );
        seqan::StringSet< seqan::CharString > test1SeqsTagList;
        seqan::CharString tag1Test1 = "t";
        seqan::CharString tag2Test1 = "t";
        seqan::CharString tag3Test1 = "t";
        seqan::CharString tag4Test1 = "t";
        seqan::appendValue( test1SeqsTagList, tag1Test1 );
        seqan::appendValue( test1SeqsTagList, tag2Test1 );
        seqan::appendValue( test1SeqsTagList, tag3Test1 );
        seqan::appendValue( test1SeqsTagList, tag4Test1 );
        string msaNameTest1 = "Test1";
        cout << "DEBUG-BP 1 \n";
    
        Msa msaTest1( test1Seqs, test1SeqsTagList, global::g_aminoAlphabet, global::g_pairAminoAlphabet, msaNameTest1 );
        string dstr = msaTest1.toString();
        cout << dstr << "\n";
    
        cout << " ... Tags " << seqan::length( msaTest1.getSequencesTagList() ) << "\n";
    
        cout << "DEBUG-BP 2\n";
        H2r h2r( msaTest1 );
        cout << "main-Debug: " << h2r.getMsa().toString() << "\n";
        double test1_exp = 0.562335; // aus Java 0.5623351446188083;
        cout << "DEBUG-BP 3\n";
    

  • Mod

    Was ist deine Frage? Deinen Debugausgaben zufolge sollte der Fehler irgendwo im Konstruktor von H2r::msa passieren. Die Initialisierungsliste passiert nämlich vor dem Code der im Konstruktor steht. Und warum benutzt du nicht gleich einen Debugger?



  • ... aber der Konstruktur ist doch leer und die Ausgabe erfolgt gar nicht, ich denke also der Konstruktur wird irgendwie gar nicht betreten ?! Ah okay im MSA-Konstruktor, das schau ich mir nochmal an, wenn ich auch verdutzt bin, dass ich nach dem MSA-Konstruktoraufruf ja noch die Debugausgabe sehen kann. Debugger-Lauf muss ich mal schauen, habe ich hier mit netbeans und c++ noch nicht probiert, wird aber höchste Eisenbahn 🙂



  • Jay1980 schrieb:

    wenn ich auch verdutzt bin, dass ich nach dem Msa-Konstruktoraufruf ja noch die Debugausgabe sehen kann.

    Dann hast du oben aber was anderes gepostet, oder siehst nicht alle Msa-Konstruktor-Aufrufe 😉

    In Zeile 54 die Debugausgabe siehst du noch.
    In Zeile 55 wird der Konstruktor von H2r aufgerufen. Da H2r (Beschissen nichtssagender Name übrigens) aber 2 Member vom Typ Msa (auch nicht viel besser) hat, werden deren Konstruktoren aufgerufen, der eine explizit (Initialisierungsliste), der andere implizit. Da der Konstruktor-Rumpf von H2r::H2r nicht mehr betreten wird, wird die Assertion wohl bei der Initialisierung von msa oder von msaToCompare zuschlagen.


  • Mod

    Jay1980 schrieb:

    ... aber der Konstruktur ist doch leer

    Häh?

    H2r( Msa& m ) : msa(m){
    
            std::cout << "MSA-Konstruktor ..." << std::endl;
            //cout << msa.toString() << endl;
    
        }
    

    und die Ausgabe erfolgt gar nicht, ich denke also der Konstruktur wird irgendwie gar nicht betreten ?!

    Häh? Das habe ich doch gerade erklärt!

    dass ich nach dem MSA-Konstruktoraufruf ja noch die Debugausgabe sehen kann.

    Häh?

    cout << "DEBUG-BP 2\n";
        H2r h2r( msaTest1 );
    
    DEBUG-BP 1
    ... Tags 4
    Msa.toString() [ 4 Sequenzen, 4 Spalten ]
    t | YLKG
    t | YLEG
    t | YLEG
    t | FLNG
    
    DEBUG-BP 2
    
    /home/joba/jobaprogramme/seqan_bioinf/Seqan_Release_1.3/seqan/sequence/string_base.h:237 Assertion failed : static_cast<TStringPos>(pos) < static_cast<TStringPos>(length(me)) was: 0 >= 0 (Trying to access an element behind the last one!)
    

    Die Debugausgabe bricht doch genau davor ab!

    wird aber höchste Eisenbahn

    Glaube ich auch. Und trink einen Kaffee oder so, die vielen Hähs die ich zu deiner Antwort habe, deuten da drauf hin, dass du gerade sehr verwirrt bist und selber nicht mehr durch ein eigenes Programm durchblickst (was auch nicht unerheblich an deinem Programmierstil liegen dürfte).



  • Danke für die Rückmeldung ... ich meinte es so:
    das msa-Objekt, das ich dem H2r-Konstruktor mitgebe, das lasse ich mir ja vorher als String ausgeben - da denke ich das passt. Dann folgt die Debug-Ausgabe 'DEBUG-BP 2', dann denke ich mir ok, jetzt H2r-Instanz erzeugen und da hakts - verstehe ich nicht? Mal schauen, ob meine Verwirrung mit einer Tassee Kaffee weggeht, da warte ich nämlich schon lange drauf 🙂



  • Ich konnte das Problem weiter eingrenzen: aus irgendeinem Grund wird der Standardkonstruktor aufgerufen, dieser leitet an eine Methode initializeImportantColumns() weiter, in dieser Methode kracht es dann, da dort das erste Element des Vektors gebraucht wird. Allerdings ist dieses Element ja nicht da.

    Wird wohl durch die Initialisierungsliste passieren, dass da der Standardkonstruktor aufgerufen wird?!



  • Jay1980 schrieb:

    Wird wohl durch die Initialisierungsliste passieren, dass da der Standardkonstruktor aufgerufen wird?!

    Nein, es liegt daran, daß die Initialisierungsliste nicht vollständig ist. Der Konstruktor von H2r muß beide Msa-Teile initialisieren, in der Liste wird aber nur einer davon angegeben. Deshalb wird msaToCompare per Default-Konstruktor angelegt.

    PS: Wenn der Default-Konstruktor nicht funktioniert, solltest du ihn gar nicht erst zur Verfügung stellen - dann weißt dich schon der Compiler auf das Problem hin.



  • Ah ich habe den Beitrag von pumuckl voll überlesen, da stand dann eigentlich der Hinweis drin. Habs entdeckt - war ein Problem mit dem Standardkonstruktor der dann an diverse Methoden weiterleitet ... eine will dann die Länge eines Attribut-Vektor-Elements, dass es aber nicht gibt.



  • CStoll schrieb:

    Jay1980 schrieb:

    Wird wohl durch die Initialisierungsliste passieren, dass da der Standardkonstruktor aufgerufen wird?!

    Nein, es liegt daran, daß die Initialisierungsliste nicht vollständig ist. Der Konstruktor von H2r muß beide Msa-Teile initialisieren, in der Liste wird aber nur einer davon angegeben. Deshalb wird msaToCompare per Default-Konstruktor angelegt.

    PS: Wenn der Default-Konstruktor nicht funktioniert, solltest du ihn gar nicht erst zur Verfügung stellen - dann weißt dich schon der Compiler auf das Problem hin.

    Ahhhh, das ist gut, ich habe das zweite Attribut erst nachträglich eingebaut und da fiel mir mein Lapsus nicht auf. Sehr schön jetzt ist mein Blick schon etwas geschärfter.


Anmelden zum Antworten