invalid operator<



  • Folgender Test-Code:

    bool sortVisiblePatchesFrontToBack(const IndexIntervalDesc& lhs, const IndexIntervalDesc& rhs) {
    	return true;
    }
    
    void TQT::computeVisiblePatches(const ICamera& cam, std::vector<IndexIntervalDesc>& patches) {
       for(int i=0; i < 4; i++)
         tier1Quadrants[i]->traverse(cam, patches);
       std::sort(patches.begin(), patches.end(), sortVisiblePatchesFrontToBack); // Hier fliegt die assertion
    }
    

    Liefert mir beim std::sort eine Debug Assertion Failed! Expression: invalid operator<

    Was ist da der Fehler im Code?



  • Du benötigst ein strict weak ordering criterion (eindeutiges Sortierkriterium), was in deiner Funktion nicht gegeben ist.



  • Hm, aber woher weiß denn der Compiler, dass meine Funktion nur eine Dummy-Funktion ist? Syntaktisch ist mein Prädikat ja richtig.



  • Der Compiler weiss es gar nicht, der Fehler tritt ja zur Laufzeit im Debugger auf.

    In std::sort scheint es eine Assertion zu geben, die überprüft, ob eine Sortierung nach jenem Kriterium überhaupt möglich ist.



  • Sortiera schrieb:

    Folgender Test-Code:

    bool sortVisiblePatchesFrontToBack(const IndexIntervalDesc& lhs, const IndexIntervalDesc& rhs) {
    	return true;
    }
    
    void TQT::computeVisiblePatches(const ICamera& cam, std::vector<IndexIntervalDesc>& patches) {
       for(int i=0; i < 4; i++)
         tier1Quadrants[i]->traverse(cam, patches);
       std::sort(patches.begin(), patches.end(), sortVisiblePatchesFrontToBack); // Hier fliegt die assertion
    }
    

    Liefert mir beim std::sort eine Debug Assertion Failed! Expression: invalid operator<

    Was ist da der Fehler im Code?

    Du bekommst ja auch eine Laufzeitassertion und keinen Kompilerzeitfehler.



  • Also, ich habe jetzt mein Prädikat ausgeschrieben:

    bool sortVisiblePatchesFrontToBack(const IndexIntervalDesc& lhs, const IndexIntervalDesc& rhs) {
       return lhs.distanceToCamSq < rhs.distanceToCamSq;
    }
    

    An computeVisiblePatches hat sich nichts geändert. Wenn ich das ganze jetzt im Debug Modus laufen lasse, gibts keine Probleme. Wenn ichs jedoch im Release Modus starte, bekomme ich eine "Uhandled exception":

    Unhandled exception at 0x7779f217 in OR.exe: 0xC0000005: Access violation reading location 0xc679ffff.

    Ich habe im Call Stack nachgeschaut und die letzten paar Zeilen lauten:

    OR.exe!free(void * pBlock=0xc67a0000) Line 110 C

    OR.exe!std::_Destroy_range<IndexIntervalDesc,std::allocator<IndexIntervalDesc> >(IndexIntervalDesc * _First=0x0759df98, IndexIntervalDesc * _Last=0x0759dfc4, std::allocator<IndexIntervalDesc> & _Al={...}, std::_Nonscalar_ptr_iterator_tag __formal={...}) Line 235 + 0xf bytes C++

    OR.exe!std::vector<IndexIntervalDesc,std::allocator<IndexIntervalDesc> >::_Insert_n(std::_Vector_iterator<IndexIntervalDesc,std::allocator<IndexIntervalDesc> > _Where={nodeID=<Bad Ptr> distanceToCamSq=1.9114282e+036 indexCount=470909263 ...}, unsigned int _Count=1, const IndexIntervalDesc & _Val={...}) Line 1156 C++

    Weiß irgendwer was das bedeutet und wieso es ihn im Relase Modus zerlegt? 😕


Anmelden zum Antworten