STL Error EAccessViolation bei sort()



  • Hallo C++ Community,

    ich hab einen wahrscheinlich blöden Fehler komm aber nicht ganz dahinter, da ich mich mit STL nicht so gut auskenne. Zu meinem Problem:
    Wenn ich mein vector Array mit sort() sortieren lasse bekomme ich immer eine EAccessViolation, mit der ich aber nicht viel anfangen kann. Hier ist mein Code, vielleicht sieht jemand den Fehler:

    sort(testHelp.begin() + s, testHelp.begin() + n, (cmpfunc *) CmpFloat);
    

    wobei hier testHelp ein vector Array mit pointern auf ein anderes vector array ist. Hier die initialisierung:

    for(i=0; i<num_dbPoints; i++) {
          bool nullDBValue = false;
          for(j=0; j<features; j++)
             if(database[i].dbValue[j] != 0)
                nullDBValue = nullDBValue || true;
          if(nullDBValue) {
             testHelp[helperIndex++] = &database[i];
          }
       }
    

    für die sort Methode verwende ich folgende compare Funktion:

    int AlgoOPTICS::CmpFloat(const ClusterDB *const f, const ClusterDB *const g) {
       float h1, h2;
       h1 = f->dbValue.at(AlgoOPTICS::sortdim);
       h2 = g->dbValue.at(AlgoOPTICS::sortdim);
       if(h1 < h2)
          return 1;
       else if(h1 > h2)
          return -1;
       else
          return 0;
    }
    

    Hat jemand eine Ahnung? 😕



  • deutet ganz stark auf eine bereichsüberschreitung hin... entweder die parameter, die du sort() übergibst, sind irgendwo falsch, oder in deiner compare-funktion wird irgendwo auf was unerlaubtees zugegriffen... dabei müsste at() ja schon eine bereichsüberprüfung machen... probiers mal, in dem du deine compare-funktion ganz leer machst... dazu müsstest du CluserDB irgendeinen einfachen vergleichswert hinzufügen, am besten int, den du vorher beliebig füllst. dann ist zwar die sortierung erst mal nicht richtig aber compare ist ganz einfach und kann keine weiteren fehler enthalten... ansonsten halt mal debuggen... vielleicht liegts an deiner compare-func...



  • Wenn deine compare-Func den richtigen Typ hat, dann musst du nicht casten. Jedenfalls soll sie true zurückliefern, wenn das linke kleiner ist als das rechte, nicht -1 : 0 : 1.


Log in to reply