Vektor.size defekt oder falsch benutzt?
-
Hallo @all,
da es evtl in dem anderen Thread untergeht, poste ich es lieber nochmal neu:
nach längerer Zeit arbeite ich mal wieder an diesem Programm weiter.
Und habe auch prompt wieder ein Problem.
und zwar möchte ich zwei Vektoren bzgl ihrer Länge vergleichen.
Mich interessieren dabei nur drei Fälle: a>b, a=b, a<b.
Anbei ein paar Codeschnipsel:using namespace std; bool berechne(const bool graphen, const vector<matrix::werteTyp> rechenVektor, const vector<matrix::werteTyp> rechenVektorALT) { vector<matrix::werteTyp> rechenVektor01; vector<matrix::werteTyp> rechenVektor02; vector<matrix::werteTyp> zwischenErgebnisVektor; stanzMatrix aktuelleStanzMatrix; int rechenVektorHalbeLaenge; matrix::groessenTyp laenge; laenge = rechenVektor.size(); printf("P(%2d, %2d) = <", ausgabeN, ausgabeK); } if (ausgabeK == (anzahlErzeugendeElemente+1)) { ausgabeN++; ausgabeK--; } else { if (rechenVektorALT.size() == rechenVektor.size()) { ausgabeN--; ausgabeK++; } else if (rechenVektorALT.size() < rechenVektor.size()) { ausgabeN--; ausgabeK++; } else if (rechenVektorALT.size() > rechenVektor.size()) { ausgabeN++; ausgabeK--; } for (vector<matrix::werteTyp>::const_iterator vektorZaehler = rechenVektor.begin(); vektorZaehler != rechenVektor.end(); ++vektorZaehler) { cout << " " << *vektorZaehler; } cout << " >\n"; } rechenVektorHalbeLaenge = (int) laenge; rechenVektorHalbeLaenge /= 2; if (rechenVektorHalbeLaenge>0) { for (matrix::groessenTyp h=0; h < rechenVektorHalbeLaenge; h++) { rechenVektor01.push_back(rechenVektor[h]); rechenVektor02.push_back(rechenVektor[rechenVektorHalbeLaenge+h]); } } else { rechenVektor01.push_back(0); rechenVektor02.push_back(1); } aktuelleStanzMatrix = stanzMatrix::stanzMatrix((matrix::groessenTyp) rechenVektorHalbeLaenge, 1); if (debug_Ausgabe) cout << aktuelleStanzMatrix << endl; for (matrix::groessenTyp h=1; h <= rechenVektorHalbeLaenge; h++) { zwischenErgebnisVektor = aktuelleStanzMatrix.stanzAddition(aktuelleStanzMatrix.stanzMultiplikation(aktuelleStanzMatrix.zeile((matrix::groessenTyp) h), rechenVektor02), rechenVektor01); } if (zwischenErgebnisVektor.size()>1) { alteLaenge = laenge; berechne(graphen, zwischenErgebnisVektor, rechenVektor); } else if (zwischenErgebnisVektor.size()==1) { ergebnisVektor.push_back(zwischenErgebnisVektor[0]); } else { cout << "ENDE\n"; } return true; }Das Problem ist, selbst wenn in der Zeile
if (rechenVektorALT.size() == rechenVektor.size())die beiden Vektoren identisch sind, erkennt VC das nicht und geht in einen der beiden else-Fälle.
Gibt es evtl bekannte Probleme mit size?
Oder bin ich zu doof?
Oder wende ich size einfach nur falsch an?
-
Hallo
ich bezweifle das in der STL-Implementation solche Fehler sind (es sei denn, du hast noch den VC6, dann solltest du unbedingt einen aktuellen Compiler verwenden).
Also benutzt deinen Debugger und finde heraus, wieviele Elemente zur Laufzeit wirklich in den vectoren sind.
bis bald
akari
-
Hi akari
akari schrieb:
ich bezweifle das in der STL-Implementation solche Fehler sind
hmm, also bei VB6 kannte ich es damals, daß es Funktionen die nicht saube liefen, dementsprechend halt auch meine Frage, ob das Teil evtl als buggy bekannt ist.
akari schrieb:
(es sei denn, du hast noch den VC6, dann solltest du unbedingt einen aktuellen Compiler verwenden).
nana, ich nutz schon das VS8
akari schrieb:
Also benutzt deinen Debugger und finde heraus, wieviele Elemente zur Laufzeit wirklich in den vectoren sind.
hab ich ja schon.
wenn beide vektoren aus 2 ELementen, z.B. "1" bestehen, dann geht er trotzdem nicht in den "=="-Fall.
Es ist doch korrekt, daß size mir eine Zahl zurück gibt, oder?
Dementsprechend noch einmal meine Fragebomberking schrieb:
wende ich size einfach nur falsch an?
Hat evtl jemand Erfahrung mit diesem Fall und ich begehe nur einen dummen Anwendungsfehler?
-
Mal abgesehen davon, dass du diese Abfragen einfacher formulieren könntest und du deine Vektoren besser als konstante Referenz übergeben solltest, sehe ich bei der Frage keinen Fehler. Ich habe auch noch nie etwas von einer fehlerhaften size()-Funktion ghört. Also beherzige akaris Rat und geh mit dem Debugger durch. Du könntest die Längen ja vorher noch in zwei Variablen (vom Typ size_t) speichern.
-
Debuggst du auch im Debug-Modus?
Man kann nämlich auch im release modus debuggen, und dann kann es sein das er optisch in die falschen Quellcodeteile reinspringt.