Getter-Funktion eines Containers wird viel zu oft aufgerufen



  • Servus,

    ich habe einen Container als Attribut gespeichert, das StringSet kann man meines Erachtens als ehesten mit einem Vektor vergleichen. Jetzt ist es so, dass ich einen ganz normalen Getter dafür schreiben wollte, den ich dann auch aufrufe. Ich stelle fest, dass die Getter-Methode wie in einer Endlossschleife durchgeht und der Lauf dann irgendwann abbricht - was ist da los?

    Der komplette Quellcode ist hier in einer Datei, die beiden relevanten Stellen mit // XXX... hervorgehoben:
    http://www.jochen-bauer.net/downloads/main-03032011.txt

    Die beiden Stellen sind:

    seqan::StringSet< seqan::CharString > getSequencesList() {
            cout << "Msa-getSequencesList() ...\n";
            cout << "... // Msa-getSequencesList()\n";
            return sequencesList;
        } // TODO schauen ob da eine Referenz als Rückgabe passender ist
    
    // Debug Msa
        string str = msaToCompute.toString();
        // TODO wieso kommen hier 1000 Aufrufe statt nur einer?
        seqan::StringSet< seqan::CharString > seqListTemp = msaToCompute.getSequencesList();
        int numberOfSeqs = seqan::length( seqListTemp );
        cout << "\n MSA (" << numberOfSeqs << " Sequenzen);\n";
        cout << str;
    


  • Hallo Jay1980,

    sobald die Zeile

    seqan::StringSet< seqan::CharString > seqListTemp = msaToCompute.getSequencesList();
    

    durchlaufen wird, wird vom Objekt der Klasse seqan::StringSet< seqan::CharString > eine Kopie angelegt.

    Meinst Du mit "wieso kommen hier 1000 Aufrufe statt nur einer?" dass 1000 mal "Msa-getSequencesList() ...\n" usw. ausgegeben wird?
    Bist Du sicher, dass oben genannte Zeile (bzw. besser die Methode getSequencesList()) nicht mehr als einmal durchlaufen wird? Wie oft wird denn H2r::computeDependancies() aufgerufen? Dort ist eine Schleife, die so oft aufgerufen wird, wie sich Elemente in dem StringSet-Objekt befinden.

    @Nachtrag: wenn Du statt

    double getCurrentPairEntropy( seqan::StringSet<seqan::CharString> sequencesList, int currentColumn, int columnPartner)
    

    besser schreibst

    double getCurrentPairEntropy( const seqan::StringSet<seqan::CharString>& sequencesList, int currentColumn, int columnPartner)
    

    und dann in getSequencesList() ein

    const seqan::StringSet<seqan::CharString>&
    

    als Returntype wählst, wäre wohl schon viel gewonnen.

    Beschäftige Dich doch mal mit den Themen 'const correctness' und 'Initialisierungsliste'.

    Gruß
    Werner



  • Danke für die Tipps Werner,

    ich lesen die Sachen nach und ändere den Code entsprechend, du hattest Recht, ich denke die Funktion wird nicht öfter als erwartet aufgerufen, ich vergaß vorher, dass ich die Test losschickte - es tritt aber irgendwann die folgende Fehlermeldung auf und ich kann nicht direkt erkennen, an welcher Stelle ich da nach einem Fehler suchen sollte, danke vorab für etwas Aufklärung:
    /home/jay/gtd08042010/archiv/programme/seqan_bioinformatik/Seqan_Release_1.3/seqan/sequence/string_base.h:237 Assertion failed : static_cast<TStringPos>(pos) < static_cast<TStringPos>(length(me)) was: 4 >= 4 (Trying to access an element behind the last one!)



  • Okay ich habe nun mal ein paar Debugmeldungen reingetippt, um das Auftreten des Fehlers einzugrenzen und es scheint in der Methode getCurrentPairEntropy() zu krachen ... aber nicht bei den ersten Durchläufen.



  • Okay, ist gelöst, ich arbeite ja oft mit einer Matrix und wollte die Anzahl der Spalten, in die Rechnung gab ich aber die Anzahl der Zeilen.


Log in to reply