std::multiset find fehler
-
Guten Abend,
ich habe einen Fehler in std::multiset::find. Ich suche ein Element in einem Multiset. Dieses ist vorhanden. Jedoch wird es von find nicht gefunden. Dannach stürzt mein Programm wegen invaliden Pointer ab. Ich glaube das es am Compiler liegt. Ich benutzte den GCC für 64bit. Gibt es eine Compiler Einstellung damit es funktiont?
Hier ist die Ausgabe: Hinter Value steht der Wert, den der Multiset Eintrag angenommen hat. Hinter Test steht ein Boolescher Test, mit dem Element, welches Find finden soll.
Value: -inf test: 0
Value: -inf test: 0
Value: -inf test: 0
Value: -4.82803e+30 test: 0
Value: -88.5994 test: 1 // hier wirds gefunden
Value: -2.34462e-27 test: 0
Value: -8.25169e+19 test: 0
Value: -1.29279e+06 test: 0
Value: -2.97187e-16 test: 0
Value: 0 test: 0
ToFind: -88.5994
test: 0Hier ist der Quelltextausschnitt
// Ermitteln des Horizontalen Max Filters for(int row=0; row<img.rows; row++ ) { std::multiset<float> set; set.clear(); // prefill the multiset for( uint col=0; col<wsize; col++ ){ set.insert(img.at<float>(row, col)); } // left border for( uint col=0; col<wsize+1; col++ ) { set.insert(img.at<float>(row, col+wsize)); tmp1.at<float>(row, col) =*(set.rbegin()); } // inside for( uint col=wsize+1; col<img.cols-wsize; col++ ) { // Es läuft bis zu dieser Zeile und Spalte ohne Probleme durch if((row==24) && (col==608)){ foreach(float v, set){ std::cerr << "Value: " << v << " test: " << (img.at<float>(row, col-wsize-1) == v) << std::endl; } std::cerr << "ToFind: " << img.at<float>(row, col-wsize-1) << std::endl; std::cerr << "test: " << (set.find(img.at<float>(row, col-wsize-1)) != set.end()) << std::endl; } std::multiset<float>::const_iterator it(set.find(img.at<float>(row, col-wsize-1))); set.erase(it); set.insert(img.at<float>(row, col+wsize)); tmp1.at<float>(row, col) =*(set.rbegin()); } // right border for( int col=img.cols-wsize; col<img.cols; col++ ) { set.erase(set.find(img.at<float>(row, col-wsize-1))); tmp1.at<float>(row, col) =*(set.rbegin()); } }P.S. Cleanen hat nicht funktioniert. Neustarten des Rechners auch nicht.
-
Floats verhalten sich komisch beim Vergleichen. NAN-Vergleiche sind immer false, selbst wenn sie mit sich selbst verglichen werden. Weiterhin hast du immer Rundungsfehler. Leute gehen so weit, dass floats niemals per == verglichen werden sollten, weil es einfach Quatsch ist. Weiterhin sollten floats keine Keys für map oder set sein. In kurz: Es ist kein multiset-Fehler, es ist ein float-Vergleich-Fehler.
Further Reading
-
Anom schrieb:
Ich glaube das es am Compiler liegt.
warum?
Anom schrieb:
Hier ist der Quelltextausschnitt
...Das ist kein minimales Beispiel, das wir nachvollziehen könnten.