TList sortieren



  • Hab dazu die Hilfe gelesen zu TList::Sort() und mir auch das Beispiel angeschaut aber leider nicht verstanden. Vielleicht kanns mir einer hier nochmal erklären. Hab den BCB6 und das Beispiel dort arbeitet mit CompareText, was ich nicht verwenden kann, da ich bei mir eine Eigenschaft meiner gespeicherten Instanz vom Typ int vergleichen möchte.

    Vielleicht knn mir auch hier jemand ein kurzes Beispiel psten oder wenigstens sagen, wodurch ich CompareText aus dem Beispiel ersetzen muss.



  • Poster schrieb:

    wenigstens sagen, wodurch ich CompareText aus dem Beispiel ersetzen muss.

    CompareValue !?



  • int __fastcall CRouting::CompareWay(void * Item1, void * Item2)
    {
      return CompareValue(((CNode*)Item1)->GetGesamtWegekosten(), ((CNode *)Item2)->GetGesamtWegekosten());
    }
    //---------------------------------------------------------------------------
    
     WayPoints->Sort(CompareWay);
    

    Funktioniert leider nicht!
    [C++ Fehler] CRouting.cpp(272): E2034 Konvertierung von 'int (_fastcall * (_closure )(void *,void *))(void *,void *)' nach 'int (_fastcall *)(void *,void *)' nicht möglich

    [C++ Fehler] CRouting.cpp(272): E2342 Keine Übereinstimmung des Typs beim Parameter 'Compare' ('int (_fastcall *)(void *,void *)' erwartet, 'void' erhalten)



  • Die Callback-Funktion darf nicht als Klassen-Methode deklariert sein.

    int __fastcall CompareWay(void * Item1, void * Item2) 
    { 
      ...
    }
    

    Eine Begründung muss ich dir aber schuldig bleiben. 🙂



  • Jo supi, jetzt scheints zu gehen. Ob er wirklich auch sortiert, probier ich dann morgen. Danke



  • Irgendwie scheint das nicht zu funktionieren.

    Deshalb die Frage ob ich das wirklich richrig verstanden habe.

    Der Auruf von

    WayPoints->Sort(CompareWay);
    

    sortiert die Liste nach dem was ich in meiner CompareFunktion angegeben habe?!
    Oder muss ich das Sort() auch noch irgendwie verbauen.

    Ich komm deshalb da drauf, weil das ja eigentlich mit Quicksort arbeitet und der ja ziemlich schnell ist. Wenn ich allerdings mit meiner selbstgeschriebenen Funktion arbeite bin ich scheinbar viel schneller.

    Ich brauch das für eine Wegesuche, wobei ich aus der Liste den Node mit den geringsten Wegekosten ermitteln möchte.
    Momentan mach ich das in einer Schleife durchlaufe dabei alle Nodes und merk mir den kleinsten und dachte halt das das mit Quicksort schneller geht.



  • Was mir gerade noch beim Debugen aufgefallen ist:

    der springt zwar zu

    List->Sort(CompareWay);

    aber mit F7 danach nie in die CompareWay-Funktion.
    Vielleicht ist ja doch was an dem hier geposteten Code falsch?



  • Hat sich erledigt, hab einfach nur die Listen verwechselt.


Log in to reply