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: 0

    Hier 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


  • Mod

    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.


Anmelden zum Antworten