tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
1
ZUGRIFFE
738
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    Hallo liebes Forum,

    ich hab da ein Problem mit der std::list::erase() Funktion.
    Irgendwie habe ich das Gefühl, dass diese nicht ganz sauber funtioniert.
    Laut definition soll ja erase() ein iterator auf das nächste Objekt liefern!
    Es kommt nur bei langen Listen zu folgendem Fehler:

    list iterator not dereferencable
    sowie:
    Standard C++ Libraries Out of Range
    Das kann aber nicht sein, da vorher darauf geprüft wird!

    Hier erstmal die Funktion, wo der fehler passiert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    void RoiDetector::updateObjectList( std::list<DetectedObject*>::iterator& iter, std::list<DetectedObject*>::iterator& findIter )
    {
        DetectedObject* newObject = NULL;
        newObject = new DetectedObject( (*iter)->data, (*iter)->category, (*iter)->ratio );
        newObject->data.area += (*findIter)->data.area;
        newObject->data.rect = newRect;
        double rectArea = newObject->data.rect.width * newObject->data.rect.height;
        newObject->ratio = rectArea / newObject->data.area;
        delete (*findIter);
        //erase() gibt einen gültigen Iterator auf das nächste Element zurück
            //Hier passiert wohl der Fehler:
        findIter = ObjectList.erase( findIter );
        delete (*iter);
        (*iter) = newObject;
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    void RoiDetector::determineCoherentText( void )
    {
     
        for( std::list<DetectedObject*>::iterator iter = ObjectList.begin(); iter != ObjectList.end(); ++iter )
        {
            if( (*iter)->isText() )
            {
                std::list<DetectedObject*>::iterator findIter = ObjectList.begin();
                nextFindIterObjekt( findIter, iter );
                    
                while( findIter != ObjectList.end() )
                {
                    if( (*findIter)->isText() && findIter != iter )
                    {
                        if( isNeighbour( (*iter), (*findIter) ) )
                        {
                            updateObjectList( iter, findIter );
                        }else
                        {
                            nextFindIterObjekt( findIter, iter );
                        }
                    }else
                    {
                        nextFindIterObjekt( findIter, iter );
                    }
                }
            }
        }
    }

    Und hier noch der Vollständigkeits wegen der iterator inkrementierer:

    Code :
    1
    2
    3
    4
    5
    6
    
    void RoiDetector::nextFindIterObjekt( std::list<DetectedObject*>::iterator& findIter, std::list<DetectedObject*>::iterator& iter )
    {
        ++findIter;
        if( findIter == iter && iter != ObjectList.end() )
            ++findIter;
    }

    Ich kann nicht nachvollziehen warum es nur bei bestimmten Konstelationen zu diesem Fehler kommt...
    Hat jemand Erfahrungen mit den Listen? Und kennt den Fehler?



    Vielen Dank und liebe Grüße
    RuFF

    //--------------------------------------------------------------------------------------------------------------
    Irrelevante Zusatzinfos:

    Es geht um ein automatisiertes Bildverarbeitungs Programm, welches Objekte erkennen soll. Hier werden die erkannten Textobjekte zusammengeführt, falls es sich, um einzelnen Buchstaben handelt die nahe beieinander stehen...
    //--------------------------------------------------------------------------------------------------------------
    Geändert von RuFFnEcK (29.09.09 um 16:16 Uhr)
     

  2. #2
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    Ähm *hust* Hab den Code oben mal schnell editiert
    Es gab da noch einen kleinen Dreher, auf den ich hier mal nicht weiter eingehen will
    Hat sich erledigt der Code oben t getz einwandfrei *g*

    Kleiner Tipp an alle: Achtet immer auf die Reihenfolge der Parameter!
    Im Projekt hab ich natürlich die Reihenfolgen inzwischen angepasst
    Geändert von RuFFnEcK (29.09.09 um 16:18 Uhr)
     

Ähnliche Themen

  1. Antworten: 15
    Letzter Beitrag: 10.11.08, 14:33
  2. Antworten: 11
    Letzter Beitrag: 17.09.08, 02:33
  3. Fehler bei string.erase()
    Von Neogen1 im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 17.04.08, 20:31
  4. Antworten: 4
    Letzter Beitrag: 07.02.06, 22:58
  5. STL List erase() crasht
    Von jccTeq im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 17.02.05, 09:49