So, hier erstmal der Comparer mit einer ordentlichen Typkonvertierung
Delphi-Quellcode:
function ListSortCompetitors(Item1, Item2: Pointer): Integer;
var
C1, C2: TodCompetitor;
begin
C1 := TObject(Item1) as TodCompetitor;
C2 := TObject(Item2) as TodCompetitor;
Result := CompareValue(C2.GameParty.PlayerList.Count, C1.GameParty.PlayerList.Count);
if Result = 0 then
Result := Random(3) - 1;
end;
Delphi-Quellcode:
function ListSortCompetitors(Item1, Item2: Pointer): Integer;
begin
Result := CompareValue((TObject(Item2) as TodCompetitor).GameParty.PlayerList.Count,
(TObject(Item1) as TodCompetitor).GameParty.PlayerList.Count);
if Result = 0 then
Result := Random(3) - 1;
end;
Ansonsten ist die Unterschreidung nach Speicheradresse kommplett falsch gedacht, denn die Verteilung im Speicher ist willkürlich und wie schon erwähnt, sind Werte über $10000000 vollkommen plausibel und definitiv kein Erkennungsmerkmal für einen "defekten" Pointer. (vorallem wenn dein Arbeitsspeicher mal etwas voller wird).
Wenn bei dieser Funktion Zeiger defekt sind, dann sind vermutlich die schon die Zeiger defekt, welche sich in deiner Liste befinden.
Liegt es nicht an der Liste liegt, dann könnte es höchstens noch daran liegen, daß deine Zufallswerte den Sortieralgo durchdrehen lassen und dieser z.B. über die Arraygrenzen seiner Liste hinausläuft.
Aber auch das dürfte nicht passieren und ich würde sowas dann eher als einen Bug im Sortieralgorithmus abstempeln.
(auch wenn es nicht so einfach ist, wenn man versucht sich ständig verändernde Werte zu sortieren, welche sich wärend des Sortierens verändern, ohne daß man sie vorher zwischenspeichert)