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.txtDie 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.