Vector durchlaufen
-
Hi,
ich habe einen Vector. Diesen soll ich durchlaufen lassen und jeden Eintrag mit den Einträgen des Vectors vergleichen, daraus bekomme ich ein Ergebnis. Dieses Ergebnis soll ich dann überprüfen indem ich noch einmal den Vector durchlaufen lasse.
Ich hab das mal so probiert, bekomme aber einen Speicherzugriffsfehler:
for(W_pixel::iterator i = right.begin(); i != right.end() - 1; ++i) { for(W_pixel::iterator j = i + 1; j != right.end(); ++j) { //Berechne etwas for(W_pixel::iterator po = i + 1; po != right.end(); po++) { // Jetzt rechne ich dann mit dem Ergebnis weiter.
Danke schon mal!
-
Der Code, den du da postest, scheint in Ordnung zu sein.
Löscht du evtl. etwas in dem vector oder fügst etwas hinzu per push_back? In dem Fall werden nämlich die Iteratoren ungültig und dein ganze Algorithmus ist zum Teufel.Wie immer gilt auch hier: ohne den vollständigen, aufs Wesentliche reduzierten Code, kann man dir nicht viel weiter helfen.
-
Wenn 'right' leer ist, dann knallt es doch direkt.
-
bekomme folgenden Laufzeitfehler:
Unbehandelte Ausnahme bei 0x75a79617 in reCaptcha.exe: Microsoft C++-Ausnahme: std::bad_alloc an Speicherposition 0x0046ed38..
Das komische ist, dieser Code funktioniert einwandfrei ohne die dritte For-Schleife. Achja und "right" ist gefüllt
Danke schon mal!
-
Kann mir nicht vortstellen, dass die std::bad_alloc im gezeigten Code auftritt. Zeig den Rest. Warum tust Du das nicht debuggen?
-
ich habe es gerade noch einmal nachgeprüft. Es ist echt die letzte For-Schleife.
for(W_Daten::iterator i = right.begin(); i != right.end() - 1; ++i) { for(W_Daten::iterator j = i + 1; j != right.end(); ++j) { a = *i; b = *j; d1 = (sqrt((double)((a.GetY() - b.GetY()) + ((a.GetX() - b.GetX())*))) / 2; if(d1 > 0 && d1 < 10) { Alpha = math::toDegree( std::atan((double)(b.GetY() - a.GetY()) / (b.GetX() - a.GetX()))); for(W_Daten::iterator po = i + 1; po != right.end(); po++) { //weiter rechnen... } } } }
-
Erstmal sieht die Zeile 8 etwas unvollständig aus.
Und zweitens: Veränderst du in dem "weiter rechnen" Bereich aus Zeile 14 irgendwie den Vektor? Wenn sich dessen Größe unterwegs ändert, könnte er den kompletten Speicherbereich umkopieren und dann sind alle Iteratoren ungültig und du könntest über die Zugriffe auf diese Iteratoren Verwaltungsdaten des Heap-Managers zerstören.
-
Nein... Ich vergleiche und rechne eigentlich nur. Am Schluß trage ich die Ergebnisse in einen anderen Vector ein.
-
Ich hab meinen Fehler gefunden: Es war ein Array das einfach nicht geung Platz hatte. Gibt es vielleicht eine andere Lösung als ein Array um Daten so zu speichern, damit ich am Schluß auslesen kann welcher Eintrag am meisten vorgekommen ist?
Danke schon mal!
-
Ja, nimm lieber einen STL-Container (vector<> oder eventuell map<>).
-
Anscheinend war das nicht der Hauptfehler. Der Vector der das Ergebnis speichert gibt mir den Laufzeitfehler aus, nicht das Array (habs aber trotzdem ersetzt ;)).
//finden ist Vectorname, gefunden ist eine Klasse finden.push_back(gefunden(Theta, d1, d2, a.GetX(), a.GetY(), b.GetX(), b.GetY(), mX, mY, shown, B, Alpha))